Support the creation of scopes.

This commit is contained in:
steve 1999-11-27 19:07:57 +00:00
parent ac25dc03a8
commit 4cfa3e4047
20 changed files with 428 additions and 206 deletions

View File

@ -18,7 +18,7 @@
# 59 Temple Place - Suite 330 # 59 Temple Place - Suite 330
# Boston, MA 02111-1307, USA # Boston, MA 02111-1307, USA
# #
#ident "$Id: Makefile.in,v 1.28 1999/11/18 03:52:19 steve Exp $" #ident "$Id: Makefile.in,v 1.29 1999/11/27 19:07:57 steve Exp $"
# #
# #
SHELL = /bin/sh SHELL = /bin/sh
@ -68,8 +68,8 @@ distclean: clean
TT = t-null.o t-verilog.o t-vvm.o t-xnf.o TT = t-null.o t-verilog.o t-vvm.o t-xnf.o
FF = nobufz.o nodangle.o propinit.o sigfold.o synth.o xnfio.o xnfsyn.o FF = nobufz.o nodangle.o propinit.o sigfold.o synth.o xnfio.o xnfsyn.o
O = main.o cprop.o design_dump.o elaborate.o elab_expr.o elab_net.o \ O = main.o cprop.o design_dump.o dup_expr.o elaborate.o elab_expr.o \
emit.o eval.o eval_tree.o expr_synth.o functor.o \ elab_net.o emit.o eval.o eval_tree.o expr_synth.o functor.o \
lexor.o lexor_keyword.o mangle.o netlist.o pad_to_width.o \ lexor.o lexor_keyword.o mangle.o netlist.o pad_to_width.o \
parse.o parse_misc.o pform.o pform_dump.o \ parse.o parse_misc.o pform.o pform_dump.o \
set_width.o \ set_width.o \

View File

@ -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: Module.h,v 1.9 1999/08/23 16:48:39 steve Exp $" #ident "$Id: Module.h,v 1.10 1999/11/27 19:07:57 steve Exp $"
#endif #endif
# include <list> # include <list>
@ -33,6 +33,7 @@ class PFunction;
class PWire; class PWire;
class PProcess; class PProcess;
class Design; class Design;
class NetScope;
/* /*
* A module is a named container and scope. A module holds a bunch of * A module is a named container and scope. A module holds a bunch of
@ -93,7 +94,7 @@ class Module {
const list<PProcess*>& get_behaviors() const { return behaviors_; } const list<PProcess*>& get_behaviors() const { return behaviors_; }
void dump(ostream&out) const; void dump(ostream&out) const;
bool elaborate(Design*, const string&path, svector<PExpr*>*overrides_) const; bool elaborate(Design*, NetScope*scope, svector<PExpr*>*overrides_) const;
private: private:
const string name_; const string name_;
@ -113,6 +114,9 @@ class Module {
/* /*
* $Log: Module.h,v $ * $Log: Module.h,v $
* Revision 1.10 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.9 1999/08/23 16:48:39 steve * Revision 1.9 1999/08/23 16:48:39 steve
* Parameter overrides support from Peter Monta * Parameter overrides support from Peter Monta
* AND and XOR support wide expressions. * AND and XOR support wide expressions.

View File

@ -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: PWire.h,v 1.5 1999/06/17 05:34:42 steve Exp $" #ident "$Id: PWire.h,v 1.6 1999/11/27 19:07:57 steve Exp $"
#endif #endif
# include "netlist.h" # include "netlist.h"
@ -58,7 +58,7 @@ class PWire : public LineInfo {
// Write myself to the specified stream. // Write myself to the specified stream.
void dump(ostream&out) const; void dump(ostream&out) const;
void elaborate(Design*, const string&path) const; void elaborate(Design*, NetScope*scope) const;
private: private:
string name_; string name_;
@ -82,6 +82,9 @@ class PWire : public LineInfo {
/* /*
* $Log: PWire.h,v $ * $Log: PWire.h,v $
* Revision 1.6 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.5 1999/06/17 05:34:42 steve * Revision 1.5 1999/06/17 05:34:42 steve
* Clean up interface of the PWire class, * Clean up interface of the PWire class,
* Properly match wire ranges. * Properly match wire ranges.

View File

@ -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.59 1999/11/24 04:01:58 steve Exp $" #ident "$Id: design_dump.cc,v 1.60 1999/11/27 19:07:57 steve Exp $"
#endif #endif
/* /*
@ -49,6 +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)";
if (scope_)
o << " scope=" << scope_->name();
o << " #(" << rise_time() << "," << fall_time() << "," << o << " #(" << rise_time() << "," << fall_time() << "," <<
decay_time() << ") init="; decay_time() << ") init=";
for (unsigned idx = pin_count() ; idx > 0 ; idx -= 1) for (unsigned idx = pin_count() ; idx > 0 ; idx -= 1)
@ -581,7 +583,19 @@ void NetRepeat::dump(ostream&o, unsigned ind) const
void NetScope::dump(ostream&o) const void NetScope::dump(ostream&o) const
{ {
o << name_ << endl; o << name_;
switch (type_) {
case BEGIN_END:
o << " sequential block";
break;
case FORK_JOIN:
o << " parallel block";
break;
case MODULE:
o << " module";
break;
}
o << endl;
} }
void NetSTask::dump(ostream&o, unsigned ind) const void NetSTask::dump(ostream&o, unsigned ind) const
@ -710,6 +724,11 @@ void NetEIdent::dump(ostream&o) const
o << name_; o << name_;
} }
void NetEScope::dump(ostream&o) const
{
o << "<scope=" << scope_->name() << ">";
}
void NetESignal::dump(ostream&o) const void NetESignal::dump(ostream&o) const
{ {
o << name(); o << name();
@ -855,6 +874,9 @@ void Design::dump(ostream&o) const
/* /*
* $Log: design_dump.cc,v $ * $Log: design_dump.cc,v $
* Revision 1.60 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.59 1999/11/24 04:01:58 steve * Revision 1.59 1999/11/24 04:01:58 steve
* Detect and list scope names. * Detect and list scope names.
* *

38
dup_expr.cc Normal file
View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 1999 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
* General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: dup_expr.cc,v 1.1 1999/11/27 19:07:57 steve Exp $"
#endif
# include "netlist.h"
# include <cassert>
NetEScope* NetEScope::dup_expr() const
{
assert(0);
return 0;
}
/*
* $Log: dup_expr.cc,v $
* Revision 1.1 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
*/

View File

@ -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: elab_expr.cc,v 1.9 1999/11/21 17:35:37 steve Exp $" #ident "$Id: elab_expr.cc,v 1.10 1999/11/27 19:07:57 steve Exp $"
#endif #endif
@ -181,6 +181,12 @@ NetExpr* PEIdent::elaborate_expr(Design*des, const string&path) const
return tmp; return tmp;
} }
if (NetScope*nsc = des->find_scope(text_)) {
NetEScope*tmp = new NetEScope(nsc);
tmp->set_line(*this);
return tmp;
}
// If the identifier names a signal (a register or wire) // If the identifier names a signal (a register or wire)
// then create a NetESignal node to handle it. // then create a NetESignal node to handle it.
if (NetNet*net = des->find_signal(path, text_)) { if (NetNet*net = des->find_signal(path, text_)) {
@ -324,6 +330,9 @@ NetExpr*PETernary::elaborate_expr(Design*des, const string&path) const
/* /*
* $Log: elab_expr.cc,v $ * $Log: elab_expr.cc,v $
* Revision 1.10 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.9 1999/11/21 17:35:37 steve * Revision 1.9 1999/11/21 17:35:37 steve
* Memory name lookup handles scopes. * Memory name lookup handles scopes.
* *

View File

@ -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: elab_net.cc,v 1.8 1999/11/21 17:35:37 steve Exp $" #ident "$Id: elab_net.cc,v 1.9 1999/11/27 19:07:57 steve Exp $"
#endif #endif
# include "PExpr.h" # include "PExpr.h"
@ -73,7 +73,7 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path,
switch (op_) { switch (op_) {
case '^': // XOR case '^': // XOR
assert(lsig->pin_count() == rsig->pin_count()); assert(lsig->pin_count() == rsig->pin_count());
osig = new NetNet(des->local_symbol(path), NetNet::WIRE, osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE,
lsig->pin_count()); lsig->pin_count());
osig->local_flag(true); osig->local_flag(true);
for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) { for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) {
@ -92,7 +92,7 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path,
case '&': // AND case '&': // AND
assert(lsig->pin_count() == rsig->pin_count()); assert(lsig->pin_count() == rsig->pin_count());
osig = new NetNet(des->local_symbol(path), NetNet::WIRE, osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE,
lsig->pin_count()); lsig->pin_count());
osig->local_flag(true); osig->local_flag(true);
for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) { for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) {
@ -111,7 +111,7 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path,
case '|': // Bitwise OR case '|': // Bitwise OR
assert(lsig->pin_count() == rsig->pin_count()); assert(lsig->pin_count() == rsig->pin_count());
osig = new NetNet(des->local_symbol(path), NetNet::WIRE, osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE,
lsig->pin_count()); lsig->pin_count());
osig->local_flag(true); osig->local_flag(true);
for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) { for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) {
@ -156,7 +156,7 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path,
} }
// The output is the AND of the two logic values. // The output is the AND of the two logic values.
osig = new NetNet(des->local_symbol(path), NetNet::WIRE); osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE);
osig->local_flag(true); osig->local_flag(true);
connect(gate->pin(0), osig->pin(0)); connect(gate->pin(0), osig->pin(0));
des->add_signal(osig); des->add_signal(osig);
@ -237,7 +237,7 @@ NetNet* PEBinary::elaborate_net_add_(Design*des, const string&path,
width = rsig->pin_count(); width = rsig->pin_count();
// Make the adder as wide as the widest operand // Make the adder as wide as the widest operand
osig = new NetNet(des->local_symbol(path), NetNet::WIRE, width); osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE, width);
NetAddSub*adder = new NetAddSub(name, width); NetAddSub*adder = new NetAddSub(name, width);
// Connect the adder to the various parts. // Connect the adder to the various parts.
@ -306,7 +306,7 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, const string&path,
return 0; return 0;
} }
NetNet*osig = new NetNet(des->local_symbol(path), NetNet::WIRE); NetNet*osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE);
osig->local_flag(true); osig->local_flag(true);
NetNode*gate; NetNode*gate;
@ -356,7 +356,7 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, const string&path,
des->add_node(gate_t); des->add_node(gate_t);
// Attach a label to this intermediate wire // Attach a label to this intermediate wire
NetNet*tmp = new NetNet(des->local_symbol(path), NetNet*tmp = new NetNet(0, des->local_symbol(path),
NetNet::WIRE); NetNet::WIRE);
tmp->local_flag(true); tmp->local_flag(true);
connect(gate_t->pin(0), tmp->pin(0)); connect(gate_t->pin(0), tmp->pin(0));
@ -430,7 +430,7 @@ NetNet* PEBinary::elaborate_net_shift_(Design*des, const string&path,
/* Very special case, constant 0 shift. */ /* Very special case, constant 0 shift. */
if (dist == 0) return lsig; if (dist == 0) return lsig;
NetNet*osig = new NetNet(des->local_symbol(path), NetNet::WIRE, NetNet*osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE,
lsig->pin_count()); lsig->pin_count());
osig->local_flag(true); osig->local_flag(true);
@ -469,7 +469,7 @@ NetNet* PEBinary::elaborate_net_shift_(Design*des, const string&path,
lsig->pin_count(), lsig->pin_count(),
rsig->pin_count()); rsig->pin_count());
NetNet*osig = new NetNet(des->local_symbol(path), NetNet::WIRE, NetNet*osig = new NetNet(0, des->local_symbol(path), NetNet::WIRE,
lsig->pin_count()); lsig->pin_count());
osig->local_flag(true); osig->local_flag(true);
@ -514,7 +514,7 @@ NetNet* PEIdent::elaborate_net(Design*des, const string&path,
const NetEConst*pc = dynamic_cast<const NetEConst*>(pe); const NetEConst*pc = dynamic_cast<const NetEConst*>(pe);
assert(pc); assert(pc);
verinum pvalue = pc->value(); verinum pvalue = pc->value();
sig = new NetNet(path+"."+text_, NetNet::IMPLICIT, sig = new NetNet(0, path+"."+text_, NetNet::IMPLICIT,
pc->expr_width()); pc->expr_width());
for (unsigned idx = 0; idx < sig->pin_count(); idx += 1) { for (unsigned idx = 0; idx < sig->pin_count(); idx += 1) {
NetConst*cp = new NetConst(des->local_symbol(path), NetConst*cp = new NetConst(des->local_symbol(path),
@ -525,7 +525,7 @@ NetNet* PEIdent::elaborate_net(Design*des, const string&path,
} else { } else {
sig = new NetNet(path+"."+text_, NetNet::IMPLICIT, 1); sig = new NetNet(0, path+"."+text_, NetNet::IMPLICIT, 1);
des->add_signal(sig); des->add_signal(sig);
cerr << get_line() << ": warning: Implicitly defining " cerr << get_line() << ": warning: Implicitly defining "
"wire " << path << "." << text_ << "." << endl; "wire " << path << "." << text_ << "." << endl;
@ -666,7 +666,7 @@ NetNet* PEIdent::elaborate_lnet(Design*des, const string&path) const
} }
/* Fine, create an implicit wire as an l-value. */ /* Fine, create an implicit wire as an l-value. */
sig = new NetNet(path+"."+text_, NetNet::IMPLICIT, 1); sig = new NetNet(0, path+"."+text_, NetNet::IMPLICIT, 1);
des->add_signal(sig); des->add_signal(sig);
cerr << get_line() << ": warning: Implicitly defining " cerr << get_line() << ": warning: Implicitly defining "
"wire " << path << "." << text_ << "." << endl; "wire " << path << "." << text_ << "." << endl;
@ -758,7 +758,7 @@ NetNet* PENumber::elaborate_net(Design*des, const string&path,
if ((lwidth > 0) && (lwidth < width)) if ((lwidth > 0) && (lwidth < width))
width = lwidth; width = lwidth;
NetNet*net = new NetNet(des->local_symbol(path), NetNet*net = new NetNet(0, des->local_symbol(path),
NetNet::IMPLICIT, width); NetNet::IMPLICIT, width);
net->local_flag(true); net->local_flag(true);
for (unsigned idx = 0 ; idx < width ; idx += 1) { for (unsigned idx = 0 ; idx < width ; idx += 1) {
@ -795,7 +795,7 @@ NetNet* PETernary::elaborate_net(Design*des, const string&path,
assert(width == tru_sig->pin_count()); assert(width == tru_sig->pin_count());
assert(expr_sig->pin_count() == 1); assert(expr_sig->pin_count() == 1);
NetNet*sig = new NetNet(des->local_symbol(path), NetNet::WIRE, NetNet*sig = new NetNet(0, des->local_symbol(path), NetNet::WIRE,
tru_sig->pin_count()); tru_sig->pin_count());
sig->local_flag(true); sig->local_flag(true);
@ -816,6 +816,9 @@ NetNet* PETernary::elaborate_net(Design*des, const string&path,
/* /*
* $Log: elab_net.cc,v $ * $Log: elab_net.cc,v $
* Revision 1.9 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.8 1999/11/21 17:35:37 steve * Revision 1.8 1999/11/21 17:35:37 steve
* Memory name lookup handles scopes. * Memory name lookup handles scopes.
* *

View File

@ -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.129 1999/11/24 04:01:58 steve Exp $" #ident "$Id: elaborate.cc,v 1.130 1999/11/27 19:07:57 steve Exp $"
#endif #endif
/* /*
@ -54,8 +54,9 @@ static const map<string,PUdp*>* udplist = 0;
* elaboration this creates an object in the design that represent the * elaboration this creates an object in the design that represent the
* defined item. * defined item.
*/ */
void PWire::elaborate(Design*des, const string&path) const void PWire::elaborate(Design*des, NetScope*scope) const
{ {
const string path = scope->name();
NetNet::Type wtype = type_; NetNet::Type wtype = type_;
if (wtype == NetNet::IMPLICIT) if (wtype == NetNet::IMPLICIT)
wtype = NetNet::WIRE; wtype = NetNet::WIRE;
@ -141,7 +142,7 @@ void PWire::elaborate(Design*des, const string&path) const
} else { } else {
NetNet*sig = new NetNet(path + "." + name_, wtype, msb, lsb); NetNet*sig = new NetNet(scope, path + "." + name_, wtype, msb, lsb);
sig->set_line(*this); sig->set_line(*this);
sig->port_type(port_type_); sig->port_type(port_type_);
sig->set_attributes(attributes); sig->set_attributes(attributes);
@ -376,7 +377,8 @@ void PGBuiltin::elaborate(Design*des, const string&path) const
void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const
{ {
assert(get_name() != ""); assert(get_name() != "");
const string my_name = des->make_scope(path, get_name()); NetScope*my_scope = des->make_scope(path, NetScope::MODULE, get_name());
const string my_name = my_scope -> name();
const svector<PExpr*>*pins; const svector<PExpr*>*pins;
@ -445,7 +447,7 @@ void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const
// elaboration causes the module to generate a netlist with // elaboration causes the module to generate a netlist with
// the ports represented by NetNet objects. I will find them // the ports represented by NetNet objects. I will find them
// later. // later.
rmod->elaborate(des, my_name, overrides_); rmod->elaborate(des, my_scope, overrides_);
// Now connect the ports of the newly elaborated designs to // Now connect the ports of the newly elaborated designs to
// the expressions that are the instantiation parameters. Scan // the expressions that are the instantiation parameters. Scan
@ -635,7 +637,7 @@ NetNet* PEConcat::elaborate_net(Design*des, const string&path,
operands, and connect it up. Scan the operands of the operands, and connect it up. Scan the operands of the
concat operator from least significant to most significant, concat operator from least significant to most significant,
which is opposite from how they are given in the list. */ which is opposite from how they are given in the list. */
NetNet*osig = new NetNet(des->local_symbol(path), NetNet*osig = new NetNet(0, des->local_symbol(path),
NetNet::IMPLICIT, pins); NetNet::IMPLICIT, pins);
pins = 0; pins = 0;
for (unsigned idx = nets.count() ; idx > 0 ; idx -= 1) { for (unsigned idx = nets.count() ; idx > 0 ; idx -= 1) {
@ -690,7 +692,7 @@ NetNet* PEConcat::elaborate_lnet(Design*des, const string&path) const
operands, and connect it up. Scan the operands of the operands, and connect it up. Scan the operands of the
concat operator from least significant to most significant, concat operator from least significant to most significant,
which is opposite from how they are given in the list. */ which is opposite from how they are given in the list. */
NetNet*osig = new NetNet(des->local_symbol(path), NetNet*osig = new NetNet(0, des->local_symbol(path),
NetNet::IMPLICIT, pins); NetNet::IMPLICIT, pins);
pins = 0; pins = 0;
for (unsigned idx = nets.count() ; idx > 0 ; idx -= 1) { for (unsigned idx = nets.count() ; idx > 0 ; idx -= 1) {
@ -724,7 +726,7 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
NetLogic*gate; NetLogic*gate;
switch (op_) { switch (op_) {
case '~': // Bitwise NOT case '~': // Bitwise NOT
sig = new NetNet(des->local_symbol(path), NetNet::WIRE, sig = new NetNet(0, des->local_symbol(path), NetNet::WIRE,
sub_sig->pin_count()); sub_sig->pin_count());
sig->local_flag(true); sig->local_flag(true);
for (unsigned idx = 0 ; idx < sub_sig->pin_count() ; idx += 1) { for (unsigned idx = 0 ; idx < sub_sig->pin_count() ; idx += 1) {
@ -742,7 +744,7 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
case 'N': // Reduction NOR case 'N': // Reduction NOR
case '!': // Reduction NOT case '!': // Reduction NOT
sig = new NetNet(des->local_symbol(path), NetNet::WIRE); sig = new NetNet(0, des->local_symbol(path), NetNet::WIRE);
sig->local_flag(true); sig->local_flag(true);
gate = new NetLogic(des->local_symbol(path), gate = new NetLogic(des->local_symbol(path),
1+sub_sig->pin_count(), 1+sub_sig->pin_count(),
@ -759,7 +761,7 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
break; break;
case '&': // Reduction AND case '&': // Reduction AND
sig = new NetNet(des->local_symbol(path), NetNet::WIRE); sig = new NetNet(0, des->local_symbol(path), NetNet::WIRE);
sig->local_flag(true); sig->local_flag(true);
gate = new NetLogic(des->local_symbol(path), gate = new NetLogic(des->local_symbol(path),
1+sub_sig->pin_count(), 1+sub_sig->pin_count(),
@ -776,7 +778,7 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
break; break;
case '|': // Reduction OR case '|': // Reduction OR
sig = new NetNet(des->local_symbol(path), NetNet::WIRE); sig = new NetNet(0, des->local_symbol(path), NetNet::WIRE);
sig->local_flag(true); sig->local_flag(true);
gate = new NetLogic(des->local_symbol(path), gate = new NetLogic(des->local_symbol(path),
1+sub_sig->pin_count(), 1+sub_sig->pin_count(),
@ -793,7 +795,7 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
break; break;
case '^': // Reduction XOR case '^': // Reduction XOR
sig = new NetNet(des->local_symbol(path), NetNet::WIRE); sig = new NetNet(0, des->local_symbol(path), NetNet::WIRE);
sig->local_flag(true); sig->local_flag(true);
gate = new NetLogic(des->local_symbol(path), gate = new NetLogic(des->local_symbol(path),
1+sub_sig->pin_count(), 1+sub_sig->pin_count(),
@ -1124,7 +1126,7 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const
return 0; return 0;
} }
NetNet*tmp = new NetNet(n, NetNet::REG, wid); NetNet*tmp = new NetNet(0, n, NetNet::REG, wid);
tmp->set_line(*this); tmp->set_line(*this);
des->add_signal(tmp); des->add_signal(tmp);
@ -1322,7 +1324,9 @@ NetProc* PBlock::elaborate(Design*des, const string&path) const
NetBlock*cur = new NetBlock(type); NetBlock*cur = new NetBlock(type);
bool fail_flag = false; bool fail_flag = false;
string npath = name_.length()? des->make_scope(path, name_) : path; string npath = name_.length()
? des->make_scope(path, NetScope::BEGIN_END, name_) -> name()
: path;
// Handle the special case that the block contains only one // Handle the special case that the block contains only one
// statement. There is no need to keep the block node. // statement. There is no need to keep the block node.
@ -1949,8 +1953,9 @@ NetProc* PWhile::elaborate(Design*des, const string&path) const
return loop; return loop;
} }
bool Module::elaborate(Design*des, const string&path, svector<PExpr*>*overrides_) const bool Module::elaborate(Design*des, NetScope*scope, svector<PExpr*>*overrides_) const
{ {
const string path = scope->name();
bool result_flag = true; bool result_flag = true;
// Generate all the parameters that this instance of this // Generate all the parameters that this instance of this
@ -2035,7 +2040,7 @@ bool Module::elaborate(Design*des, const string&path, svector<PExpr*>*overrides_
; wt != wl.end() ; wt != wl.end()
; wt ++ ) { ; wt ++ ) {
(*wt)->elaborate(des, path); (*wt)->elaborate(des, scope);
} }
// Elaborate functions. // Elaborate functions.
@ -2129,11 +2134,11 @@ Design* elaborate(const map<string,Module*>&modules,
// module and elaborate what I find. // module and elaborate what I find.
Design*des = new Design; Design*des = new Design;
des->make_root_scope(root); NetScope*scope = des->make_root_scope(root);
modlist = &modules; modlist = &modules;
udplist = &primitives; udplist = &primitives;
bool rc = rmod->elaborate(des, root, (svector<PExpr*>*)0); bool rc = rmod->elaborate(des, scope, (svector<PExpr*>*)0);
modlist = 0; modlist = 0;
udplist = 0; udplist = 0;
@ -2147,6 +2152,9 @@ Design* elaborate(const map<string,Module*>&modules,
/* /*
* $Log: elaborate.cc,v $ * $Log: elaborate.cc,v $
* Revision 1.130 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.129 1999/11/24 04:01:58 steve * Revision 1.129 1999/11/24 04:01:58 steve
* Detect and list scope names. * Detect and list scope names.
* *
@ -2252,50 +2260,5 @@ Design* elaborate(const map<string,Module*>&modules,
* Allow expanding of additive operators. * Allow expanding of additive operators.
* *
* Revision 1.100 1999/09/25 02:57:30 steve * Revision 1.100 1999/09/25 02:57:30 steve
* Parse system function calls.
*
* Revision 1.99 1999/09/23 03:56:57 steve
* Support shift operators.
*
* Revision 1.98 1999/09/23 02:28:27 steve
* internal error message for funky comparison width.
*
* Revision 1.97 1999/09/23 00:21:54 steve
* Move set_width methods into a single file,
* Add the NetEBLogic class for logic expressions,
* Fix error setting with of && in if statements.
*
* Revision 1.96 1999/09/22 21:25:42 steve
* Expand bits in delayed assignments.
*
* Revision 1.95 1999/09/22 04:30:04 steve
* Parse and elaborate named for/join blocks.
*
* Revision 1.94 1999/09/22 02:00:48 steve
* assignment with blocking event delay.
*
* Revision 1.93 1999/09/20 02:21:10 steve
* Elaborate parameters in phases.
*
* Revision 1.92 1999/09/18 22:23:50 steve
* Match bit widths comming out of task output ports.
*
* Revision 1.91 1999/09/18 02:51:35 steve
* report non-constant part select expressions.
*
* Revision 1.90 1999/09/18 01:53:08 steve
* Detect constant lessthen-equal expressions.
*
* Revision 1.89 1999/09/17 02:06:25 steve
* Handle unconnected module ports.
*
* Revision 1.88 1999/09/16 04:18:15 steve
* elaborate concatenation repeats.
*
* Revision 1.87 1999/09/16 00:33:45 steve
* Handle implicit !=0 in if statements.
*
* Revision 1.86 1999/09/15 04:17:52 steve
* separate assign lval elaboration for error checking.
*/ */

17
emit.cc
View File

@ -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: emit.cc,v 1.29 1999/11/21 00:13:08 steve Exp $" #ident "$Id: emit.cc,v 1.30 1999/11/27 19:07:57 steve Exp $"
#endif #endif
/* /*
@ -255,6 +255,13 @@ bool Design::emit(ostream&o, struct target_t*tgt) const
bool rc = true; bool rc = true;
tgt->start_design(o, this); tgt->start_design(o, this);
// enumerate the scopes
{ map<string,NetScope*>::const_iterator sc;
for (sc = scopes_.begin() ; sc != scopes_.end() ; sc++) {
tgt->scope(o, (*sc).second);
}
}
// emit signals // emit signals
if (signals_) { if (signals_) {
NetNet*cur = signals_->sig_next_; NetNet*cur = signals_->sig_next_;
@ -339,6 +346,11 @@ void NetEParam::expr_scan(struct expr_scan_t*tgt) const
<< endl; << endl;
} }
void NetEScope::expr_scan(struct expr_scan_t*tgt) const
{
tgt->expr_scope(this);
}
void NetEUFunc::expr_scan(struct expr_scan_t*tgt) const void NetEUFunc::expr_scan(struct expr_scan_t*tgt) const
{ {
tgt->expr_ufunc(this); tgt->expr_ufunc(this);
@ -382,6 +394,9 @@ bool emit(ostream&o, const Design*des, const char*type)
/* /*
* $Log: emit.cc,v $ * $Log: emit.cc,v $
* Revision 1.30 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.29 1999/11/21 00:13:08 steve * Revision 1.29 1999/11/21 00:13:08 steve
* Support memories in continuous assignments. * Support memories in continuous assignments.
* *

View File

@ -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: expr_synth.cc,v 1.4 1999/11/19 03:00:59 steve Exp $" #ident "$Id: expr_synth.cc,v 1.5 1999/11/27 19:07:57 steve Exp $"
#endif #endif
# include "netlist.h" # include "netlist.h"
@ -45,7 +45,7 @@ NetNet* NetEBAdd::synthesize(Design*des)
assert(lsig->pin_count() == rsig->pin_count()); assert(lsig->pin_count() == rsig->pin_count());
unsigned width=lsig->pin_count(); unsigned width=lsig->pin_count();
NetNet*osig = new NetNet(path, NetNet::IMPLICIT, width); NetNet*osig = new NetNet(0, path, NetNet::IMPLICIT, width);
string oname = des->local_symbol(path); string oname = des->local_symbol(path);
NetAddSub *adder = new NetAddSub(oname, width); NetAddSub *adder = new NetAddSub(oname, width);
@ -82,7 +82,7 @@ NetNet* NetEBBits::synthesize(Design*des)
NetNet*rsig = right_->synthesize(des); NetNet*rsig = right_->synthesize(des);
assert(lsig->pin_count() == rsig->pin_count()); assert(lsig->pin_count() == rsig->pin_count());
NetNet*osig = new NetNet(path, NetNet::IMPLICIT, lsig->pin_count()); NetNet*osig = new NetNet(0, path, NetNet::IMPLICIT, lsig->pin_count());
for (unsigned idx = 0 ; idx < osig->pin_count() ; idx += 1) { for (unsigned idx = 0 ; idx < osig->pin_count() ; idx += 1) {
string oname = des->local_symbol(path); string oname = des->local_symbol(path);
@ -124,7 +124,7 @@ NetNet* NetEConst::synthesize(Design*des)
string path = des->local_symbol("SYNTH"); string path = des->local_symbol("SYNTH");
unsigned width=expr_width(); unsigned width=expr_width();
NetNet*osig = new NetNet(path, NetNet::IMPLICIT, width); NetNet*osig = new NetNet(0, path, NetNet::IMPLICIT, width);
for (unsigned idx = 0 ; idx < width; idx += 1) { for (unsigned idx = 0 ; idx < width; idx += 1) {
string oname = des->local_symbol(path); string oname = des->local_symbol(path);
NetConst *c = new NetConst(oname, value().get(idx)); NetConst *c = new NetConst(oname, value().get(idx));
@ -144,7 +144,7 @@ NetNet* NetEUBits::synthesize(Design*des)
string path = des->local_symbol("SYNTH"); string path = des->local_symbol("SYNTH");
NetNet*isig = expr_->synthesize(des); NetNet*isig = expr_->synthesize(des);
NetNet*osig = new NetNet(path, NetNet::IMPLICIT, isig->pin_count()); NetNet*osig = new NetNet(0, path, NetNet::IMPLICIT, isig->pin_count());
for (unsigned idx = 0 ; idx < osig->pin_count() ; idx += 1) { for (unsigned idx = 0 ; idx < osig->pin_count() ; idx += 1) {
string oname = des->local_symbol(path); string oname = des->local_symbol(path);
@ -178,7 +178,7 @@ NetNet* NetETernary::synthesize(Design *des)
assert(csig->pin_count() == 1); assert(csig->pin_count() == 1);
assert(tsig->pin_count() == fsig->pin_count()); assert(tsig->pin_count() == fsig->pin_count());
unsigned width=tsig->pin_count(); unsigned width=tsig->pin_count();
NetNet*osig = new NetNet(path, NetNet::IMPLICIT, width); NetNet*osig = new NetNet(0, path, NetNet::IMPLICIT, width);
string oname = des->local_symbol(path); string oname = des->local_symbol(path);
NetMux *mux = new NetMux(oname, width, 2, 1); NetMux *mux = new NetMux(oname, width, 2, 1);
@ -195,8 +195,7 @@ NetNet* NetETernary::synthesize(Design *des)
NetNet* NetESignal::synthesize(Design*des) NetNet* NetESignal::synthesize(Design*des)
{ {
//NetNet*sig = new NetNet(name(), NetNet::WIRE, pin_count()); NetNet*sig = new NetNet(0, des->local_symbol(name()),
NetNet*sig = new NetNet(des->local_symbol(name()),
NetNet::WIRE, pin_count()); NetNet::WIRE, pin_count());
sig->local_flag(true); sig->local_flag(true);
for (unsigned idx = 0 ; idx < pin_count() ; idx += 1) for (unsigned idx = 0 ; idx < pin_count() ; idx += 1)
@ -207,6 +206,9 @@ NetNet* NetESignal::synthesize(Design*des)
/* /*
* $Log: expr_synth.cc,v $ * $Log: expr_synth.cc,v $
* Revision 1.5 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.4 1999/11/19 03:00:59 steve * Revision 1.4 1999/11/19 03:00:59 steve
* Whoops, created a signal with a duplicate name. * Whoops, created a signal with a duplicate name.
* *

View File

@ -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: netlist.cc,v 1.93 1999/11/24 04:01:59 steve Exp $" #ident "$Id: netlist.cc,v 1.94 1999/11/27 19:07:57 steve Exp $"
#endif #endif
# include <cassert> # include <cassert>
@ -368,8 +368,8 @@ NetNode::~NetNode()
design_->del_node(this); design_->del_node(this);
} }
NetNet::NetNet(const string&n, Type t, unsigned npins) NetNet::NetNet(NetScope*s, const string&n, Type t, unsigned npins)
: NetObj(n, npins), sig_next_(0), sig_prev_(0), design_(0), : NetObj(n, npins), sig_next_(0), sig_prev_(0), design_(0), scope_(s),
type_(t), port_type_(NOT_A_PORT), msb_(npins-1), lsb_(0), type_(t), port_type_(NOT_A_PORT), msb_(npins-1), lsb_(0),
local_flag_(false) local_flag_(false)
{ {
@ -378,10 +378,10 @@ NetNet::NetNet(const string&n, Type t, unsigned npins)
ivalue_[idx] = verinum::Vz; ivalue_[idx] = verinum::Vz;
} }
NetNet::NetNet(const string&n, Type t, long ms, long ls) NetNet::NetNet(NetScope*s, const string&n, Type t, long ms, long ls)
: NetObj(n, ((ms>ls)?ms-ls:ls-ms) + 1), sig_next_(0), : NetObj(n, ((ms>ls)?ms-ls:ls-ms) + 1), sig_next_(0),
sig_prev_(0), design_(0), type_(t), port_type_(NOT_A_PORT), sig_prev_(0), design_(0), scope_(s), type_(t),
msb_(ms), lsb_(ls), local_flag_(false) port_type_(NOT_A_PORT), msb_(ms), lsb_(ls), local_flag_(false)
{ {
ivalue_ = new verinum::V[pin_count()]; ivalue_ = new verinum::V[pin_count()];
for (unsigned idx = 0 ; idx < pin_count() ; idx += 1) for (unsigned idx = 0 ; idx < pin_count() ; idx += 1)
@ -394,6 +394,16 @@ NetNet::~NetNet()
design_->del_signal(this); design_->del_signal(this);
} }
NetScope* NetNet::scope()
{
return scope_;
}
const NetScope* NetNet::scope() const
{
return scope_;
}
unsigned NetNet::sb_to_idx(long sb) const unsigned NetNet::sb_to_idx(long sb) const
{ {
if (msb_ >= lsb_) if (msb_ >= lsb_)
@ -403,7 +413,7 @@ unsigned NetNet::sb_to_idx(long sb) const
} }
NetTmp::NetTmp(const string&name, unsigned npins) NetTmp::NetTmp(const string&name, unsigned npins)
: NetNet(name, IMPLICIT, npins) : NetNet(0, name, IMPLICIT, npins)
{ {
local_flag(true); local_flag(true);
} }
@ -1776,12 +1786,27 @@ NetEParam* NetEParam::dup_expr() const
return 0; return 0;
} }
NetEScope::NetEScope(NetScope*s)
: scope_(s)
{
}
NetEScope::~NetEScope()
{
}
const NetScope* NetEScope::scope() const
{
return scope_;
}
NetESignal::NetESignal(NetNet*n) NetESignal::NetESignal(NetNet*n)
: NetExpr(n->pin_count()), NetNode(n->name(), n->pin_count()) : NetExpr(n->pin_count()), NetNode(n->name(), n->pin_count())
{ {
set_line(*n); set_line(*n);
for (unsigned idx = 0 ; idx < n->pin_count() ; idx += 1) { for (unsigned idx = 0 ; idx < n->pin_count() ; idx += 1) {
pin(idx).set_name("P", idx); pin(idx).set_name("P", idx);
pin(idx).set_dir(NetObj::Link::PASSIVE);
connect(pin(idx), n->pin(idx)); connect(pin(idx), n->pin(idx));
} }
} }
@ -1790,8 +1815,10 @@ NetESignal::NetESignal(const string&n, unsigned np)
: NetExpr(np), NetNode(n, np) : NetExpr(np), NetNode(n, np)
{ {
expr_width(pin_count()); expr_width(pin_count());
for(unsigned idx = 0 ; idx < np ; idx += 1) for(unsigned idx = 0 ; idx < np ; idx += 1) {
pin(idx).set_name("P", idx); pin(idx).set_name("P", idx);
pin(idx).set_dir(NetObj::Link::PASSIVE);
}
} }
NetESignal::~NetESignal() NetESignal::~NetESignal()
@ -1927,12 +1954,12 @@ const NetExpr* NetRepeat::expr() const
} }
NetScope::NetScope(const string&n) NetScope::NetScope(const string&n)
: name_(n) : type_(NetScope::MODULE), name_(n)
{ {
} }
NetScope::NetScope(const string&p, const string&n) NetScope::NetScope(const string&p, NetScope::TYPE t)
: name_(p + "." + n) : type_(t), name_(p)
{ {
} }
@ -1940,6 +1967,11 @@ NetScope::~NetScope()
{ {
} }
NetScope::TYPE NetScope::type() const
{
return type_;
}
string NetScope::name() const string NetScope::name() const
{ {
return name_; return name_;
@ -2246,17 +2278,30 @@ Design::~Design()
{ {
} }
string Design::make_root_scope(const string&root) NetScope* Design::make_root_scope(const string&root)
{ {
scopes_[root] = new NetScope(root); NetScope*scope = new NetScope(root);
return root; scopes_[root] = scope;
return scope;
} }
string Design::make_scope(const string&path, const string&name) NetScope* Design::make_scope(const string&path,
NetScope::TYPE t,
const string&name)
{ {
string npath = path + "." + name; string npath = path + "." + name;
scopes_[npath] = new NetScope(path, name); NetScope*scope = new NetScope(npath, t);
return npath; scopes_[npath] = scope;
return scope;
}
NetScope* Design::find_scope(const string&key)
{
map<string,NetScope*>::const_iterator tmp = scopes_.find(key);
if (tmp == scopes_.end())
return 0;
else
return (*tmp).second;
} }
void Design::set_parameter(const string&key, NetExpr*expr) void Design::set_parameter(const string&key, NetExpr*expr)
@ -2572,6 +2617,9 @@ NetNet* Design::find_signal(bool (*func)(const NetNet*))
/* /*
* $Log: netlist.cc,v $ * $Log: netlist.cc,v $
* Revision 1.94 1999/11/27 19:07:57 steve
* Support the creation of scopes.
*
* Revision 1.93 1999/11/24 04:01:59 steve * Revision 1.93 1999/11/24 04:01:59 steve
* Detect and list scope names. * Detect and list scope names.
* *
@ -2864,78 +2912,5 @@ NetNet* Design::find_signal(bool (*func)(const NetNet*))
* *
* Revision 1.15 1999/02/03 04:20:11 steve * Revision 1.15 1999/02/03 04:20:11 steve
* Parse and elaborate the Verilog CASE statement. * Parse and elaborate the Verilog CASE statement.
*
* Revision 1.14 1998/12/18 05:16:25 steve
* Parse more UDP input edge descriptions.
*
* Revision 1.13 1998/12/17 23:54:58 steve
* VVM support for small sequential UDP objects.
*
* Revision 1.12 1998/12/14 02:01:35 steve
* Fully elaborate Sequential UDP behavior.
*
* Revision 1.11 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.10 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.9 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.8 1998/11/23 00:20:23 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.7 1998/11/18 04:25:22 steve
* Add -f flags for generic flag key/values.
*
* Revision 1.6 1998/11/16 05:03:53 steve
* Add the sigfold function that unlinks excess
* signal nodes, and add the XNF target.
*
* Revision 1.5 1998/11/13 06:23:17 steve
* Introduce netlist optimizations with the
* cprop function to do constant propogation.
*
* Revision 1.4 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.3 1998/11/07 19:17:10 steve
* Calculate expression widths at elaboration time.
*
* 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:29:00 steve
* Introduce verilog to CVS.
*
*/ */

View File

@ -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.94 1999/11/24 04:01:59 steve Exp $" #ident "$Id: netlist.h,v 1.95 1999/11/27 19:07:58 steve Exp $"
#endif #endif
/* /*
@ -39,6 +39,7 @@ class Design;
class NetNode; class NetNode;
class NetProc; class NetProc;
class NetProcTop; class NetProcTop;
class NetScope;
class NetExpr; class NetExpr;
class NetESignal; class NetESignal;
class ostream; class ostream;
@ -232,12 +233,14 @@ class NetNet : public NetObj, public LineInfo {
enum PortType { NOT_A_PORT, PIMPLICIT, PINPUT, POUTPUT, PINOUT }; enum PortType { NOT_A_PORT, PIMPLICIT, PINPUT, POUTPUT, PINOUT };
explicit NetNet(const string&n, Type t, unsigned npins =1); explicit NetNet(NetScope*s, const string&n, Type t, unsigned npins =1);
explicit NetNet(const string&n, Type t, long ms, long ls); explicit NetNet(NetScope*s, const string&n, Type t, long ms, long ls);
virtual ~NetNet(); virtual ~NetNet();
NetScope* scope();
const NetScope* scope() const;
Type type() const { return type_; } Type type() const { return type_; }
void type(Type t) { type_ = t; } void type(Type t) { type_ = t; }
@ -274,6 +277,7 @@ class NetNet : public NetObj, public LineInfo {
Design*design_; Design*design_;
private: private:
NetScope*scope_;
Type type_; Type type_;
PortType port_type_; PortType port_type_;
@ -1619,6 +1623,29 @@ class NetEParam : public NetExpr {
string name_; string name_;
}; };
/*
* This class is a special (and magical) expression node type that
* represents scope names. These can only be found as parameters to
* NetSTask objects.
*/
class NetEScope : public NetExpr {
public:
NetEScope(NetScope*);
~NetEScope();
const NetScope* scope() const;
virtual void expr_scan(struct expr_scan_t*) const;
virtual NetEScope* dup_expr() const;
virtual void dump(ostream&os) const;
private:
NetScope*scope_;
};
/* /*
* This node represents a system function call in an expression. The * This node represents a system function call in an expression. The
* object contains the name of the system function, which the backend * object contains the name of the system function, which the backend
@ -1833,20 +1860,24 @@ class NetESubSignal : public NetExpr {
/* /*
* This object type is used to contain a logical scope within a * This object type is used to contain a logical scope within a
* design. * design. The scope doesn't represent any executable hardware, but is
* just a handle that netlist processors can use to grab at the design.
*/ */
class NetScope { class NetScope {
public: public:
enum TYPE { MODULE, BEGIN_END, FORK_JOIN };
NetScope(const string&root); NetScope(const string&root);
NetScope(const string&path, const string&n); NetScope(const string&path, TYPE t);
~NetScope(); ~NetScope();
TYPE type() const;
string name() const; string name() const;
void dump(ostream&) const; void dump(ostream&) const;
private: private:
TYPE type_;
string name_; string name_;
}; };
@ -1872,8 +1903,10 @@ class Design {
string get_flag(const string&key) const; string get_flag(const string&key) const;
string make_root_scope(const string&name); NetScope* make_root_scope(const string&name);
string make_scope(const string&path, const string&name); NetScope* make_scope(const string&path, NetScope::TYPE t,
const string&name);
NetScope* find_scope(const string&path);
// PARAMETERS // PARAMETERS
void set_parameter(const string&, NetExpr*); void set_parameter(const string&, NetExpr*);
@ -2003,6 +2036,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
/* /*
* $Log: netlist.h,v $ * $Log: netlist.h,v $
* Revision 1.95 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
* Revision 1.94 1999/11/24 04:01:59 steve * Revision 1.94 1999/11/24 04:01:59 steve
* Detect and list scope names. * Detect and list scope names.
* *

View File

@ -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.79 1999/11/24 04:38:49 steve Exp $" #ident "$Id: t-vvm.cc,v 1.80 1999/11/27 19:07:58 steve Exp $"
#endif #endif
# include <iostream> # include <iostream>
@ -54,6 +54,7 @@ class target_vvm : public target_t {
target_vvm(); target_vvm();
virtual void start_design(ostream&os, const Design*); virtual void start_design(ostream&os, const Design*);
virtual void scope(ostream&os, const NetScope*);
virtual void signal(ostream&os, const NetNet*); virtual void signal(ostream&os, const NetNet*);
virtual void memory(ostream&os, const NetMemory*); virtual void memory(ostream&os, const NetMemory*);
virtual void task_def(ostream&os, const NetTaskDef*); virtual void task_def(ostream&os, const NetTaskDef*);
@ -483,9 +484,10 @@ class vvm_parm_rval : public expr_scan_t {
string result; string result;
private: private:
virtual void expr_const(const NetEConst*expr); virtual void expr_const(const NetEConst*);
virtual void expr_ident(const NetEIdent*); virtual void expr_ident(const NetEIdent*);
virtual void expr_memory(const NetEMemory*mem); virtual void expr_memory(const NetEMemory*);
virtual void expr_scope(const NetEScope*);
virtual void expr_signal(const NetESignal*); virtual void expr_signal(const NetESignal*);
private: private:
@ -563,6 +565,11 @@ void vvm_parm_rval::expr_memory(const NetEMemory*mem)
result = string("&") + mangle(mem->name()) + ".base"; result = string("&") + mangle(mem->name()) + ".base";
} }
void vvm_parm_rval::expr_scope(const NetEScope*escope)
{
result = string("&") + mangle(escope->scope()->name()) + "_scope.base";
}
void vvm_parm_rval::expr_signal(const NetESignal*expr) void vvm_parm_rval::expr_signal(const NetESignal*expr)
{ {
string res = string("&") + mangle(expr->name()) + ".base"; string res = string("&") + mangle(expr->name()) + ".base";
@ -613,6 +620,29 @@ void target_vvm::start_design(ostream&os, const Design*mod)
start_code << "{" << endl; start_code << "{" << endl;
} }
void target_vvm::scope(ostream&os, const NetScope*scope)
{
string hname = mangle(scope->name()) + "_scope";
os << "// SCOPE: " << scope->name() << endl;
os << "static struct __vpiScope " << hname << ";" << endl;
string type_code;
switch (scope->type()) {
case NetScope::MODULE:
type_code = "vpiModule";
break;
case NetScope::BEGIN_END:
type_code = "vpiNamedBegin";
break;
case NetScope::FORK_JOIN:
type_code = "vpiNamedFork";
break;
}
init_code << " vpip_make_scope(&" << hname << ", " <<
type_code << ", \"" << scope->name() << "\");" << endl;
}
void target_vvm::end_design(ostream&os, const Design*mod) void target_vvm::end_design(ostream&os, const Design*mod)
{ {
os << "static struct __vpiStringConst string_table[" << os << "static struct __vpiStringConst string_table[" <<
@ -689,6 +719,9 @@ bool target_vvm::process(ostream&os, const NetProcTop*top)
void target_vvm::signal(ostream&os, const NetNet*sig) void target_vvm::signal(ostream&os, const NetNet*sig)
{ {
#if 1
os << "// XXXX handle signal " << sig->name() << endl;
#endif
/* Scan the signals of the vector, passing the initial value /* Scan the signals of the vector, passing the initial value
to the inputs of all the connected devices. */ to the inputs of all the connected devices. */
@ -829,6 +862,7 @@ void target_vvm::emit_gate_outputfun_(const NetNode*gate, unsigned gpin)
if (dynamic_cast<const NetNet*>(cur)) { if (dynamic_cast<const NetNet*>(cur)) {
// Skip signals // Skip signals
} else if (cur->pin(pin).get_name() != "") { } else if (cur->pin(pin).get_name() != "") {
delayed << " " << mangle(cur->name()) << ".set_" delayed << " " << mangle(cur->name()) << ".set_"
@ -1279,6 +1313,17 @@ void target_vvm::net_esignal(ostream&os, const NetESignal*net)
init_code << " vpip_make_reg(&" << net_name << init_code << " vpip_make_reg(&" << net_name <<
", \"" << net->name() << "\");" << endl; ", \"" << net->name() << "\");" << endl;
#if 0
/* If the signal (that I am declaring and initializing) is
attached to a scope in the netlist, then attach it to the
scope for real here. */
if (const NetScope*scope = net->scope()) {
init_code << " vpip_attach_to_scope(&" <<
mangle(scope->name()) << "_scope, &" << net_name <<
".base);" << endl;
}
#endif
} }
/* /*
@ -1942,6 +1987,9 @@ extern const struct target tgt_vvm = {
}; };
/* /*
* $Log: t-vvm.cc,v $ * $Log: t-vvm.cc,v $
* Revision 1.80 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
* Revision 1.79 1999/11/24 04:38:49 steve * Revision 1.79 1999/11/24 04:38:49 steve
* LT and GT fixes from Eric Aardoom. * LT and GT fixes from Eric Aardoom.
* *

View File

@ -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: target.cc,v 1.26 1999/11/21 00:13:09 steve Exp $" #ident "$Id: target.cc,v 1.27 1999/11/27 19:07:58 steve Exp $"
#endif #endif
# include "target.h" # include "target.h"
@ -31,6 +31,10 @@ void target_t::start_design(ostream&os, const Design*)
{ {
} }
void target_t::scope(ostream&, const NetScope*)
{
}
void target_t::signal(ostream&os, const NetNet*) void target_t::signal(ostream&os, const NetNet*)
{ {
} }
@ -267,6 +271,12 @@ void expr_scan_t::expr_memory(const NetEMemory*)
"unhandled expr_memory." << endl; "unhandled expr_memory." << endl;
} }
void expr_scan_t::expr_scope(const NetEScope*)
{
cerr << "expr_scan_t (" << typeid(*this).name() << "): "
"unhandled expr_scope." << endl;
}
void expr_scan_t::expr_signal(const NetESignal*) void expr_scan_t::expr_signal(const NetESignal*)
{ {
cerr << "expr_scan_t (" << typeid(*this).name() << "): " cerr << "expr_scan_t (" << typeid(*this).name() << "): "
@ -305,6 +315,9 @@ void expr_scan_t::expr_binary(const NetEBinary*ex)
/* /*
* $Log: target.cc,v $ * $Log: target.cc,v $
* Revision 1.27 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
* Revision 1.26 1999/11/21 00:13:09 steve * Revision 1.26 1999/11/21 00:13:09 steve
* Support memories in continuous assignments. * Support memories in continuous assignments.
* *

View File

@ -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: target.h,v 1.25 1999/11/21 00:13:09 steve Exp $" #ident "$Id: target.h,v 1.26 1999/11/27 19:07:58 steve Exp $"
#endif #endif
# include "netlist.h" # include "netlist.h"
@ -55,6 +55,10 @@ struct target_t {
/* Start the design. */ /* Start the design. */
virtual void start_design(ostream&os, const Design*); virtual void start_design(ostream&os, const Design*);
/* This is called once for each scope in the design, before
anything else is called. */
virtual void scope(ostream&os, const NetScope*);
/* Output a signal (called for each signal) */ /* Output a signal (called for each signal) */
virtual void signal(ostream&os, const NetNet*); virtual void signal(ostream&os, const NetNet*);
@ -117,6 +121,7 @@ struct expr_scan_t {
virtual void expr_concat(const NetEConcat*); virtual void expr_concat(const NetEConcat*);
virtual void expr_ident(const NetEIdent*); virtual void expr_ident(const NetEIdent*);
virtual void expr_memory(const NetEMemory*); virtual void expr_memory(const NetEMemory*);
virtual void expr_scope(const NetEScope*);
virtual void expr_signal(const NetESignal*); virtual void expr_signal(const NetESignal*);
virtual void expr_subsignal(const NetESubSignal*); virtual void expr_subsignal(const NetESubSignal*);
virtual void expr_ternary(const NetETernary*); virtual void expr_ternary(const NetETernary*);
@ -142,6 +147,9 @@ extern const struct target *target_table[];
/* /*
* $Log: target.h,v $ * $Log: target.h,v $
* Revision 1.26 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
* Revision 1.25 1999/11/21 00:13:09 steve * Revision 1.25 1999/11/21 00:13:09 steve
* Support memories in continuous assignments. * Support memories in continuous assignments.
* *

View File

@ -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: vpi_user.h,v 1.7 1999/11/10 02:52:24 steve Exp $" #ident "$Id: vpi_user.h,v 1.8 1999/11/27 19:07:58 steve Exp $"
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
@ -98,6 +98,9 @@ typedef struct t_vpi_value {
#define vpiIterator 27 #define vpiIterator 27
#define vpiMemory 29 #define vpiMemory 29
#define vpiMemoryWord 30 #define vpiMemoryWord 30
#define vpiModule 32
#define vpiNamedBegin 33
#define vpiNamedFork 35
#define vpiNet 36 #define vpiNet 36
#define vpiReg 48 #define vpiReg 48
#define vpiSysTaskCall 57 #define vpiSysTaskCall 57
@ -207,6 +210,9 @@ extern void (*vlog_startup_routines[])();
/* /*
* $Log: vpi_user.h,v $ * $Log: vpi_user.h,v $
* Revision 1.8 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
* Revision 1.7 1999/11/10 02:52:24 steve * Revision 1.7 1999/11/10 02:52:24 steve
* Create the vpiMemory handle type. * Create the vpiMemory handle type.
* *

View File

@ -18,7 +18,7 @@
# 59 Temple Place - Suite 330 # 59 Temple Place - Suite 330
# Boston, MA 02111-1307, USA # Boston, MA 02111-1307, USA
# #
#ident "$Id: Makefile.in,v 1.13 1999/11/22 00:30:52 steve Exp $" #ident "$Id: Makefile.in,v 1.14 1999/11/27 19:07:58 steve Exp $"
# #
# #
SHELL = /bin/sh SHELL = /bin/sh
@ -63,7 +63,7 @@ vvm_simulation.o vvm_thread.o vpip.o
P = vpi_callback.o \ P = vpi_callback.o \
vpi_const.o vpi_iter.o vpi_memory.o vpi_null.o \ vpi_const.o vpi_iter.o vpi_memory.o vpi_null.o \
vpi_priv.o vpi_signal.o vpi_simulation.o vpi_systask.o vpi_time.o vpi_priv.o vpi_scope.o vpi_signal.o vpi_simulation.o vpi_systask.o vpi_time.o
libvvm.a: $O libvvm.a: $O
rm -f $@ rm -f $@

View File

@ -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: vpi_priv.h,v 1.6 1999/11/10 02:52:24 steve Exp $" #ident "$Id: vpi_priv.h,v 1.7 1999/11/27 19:07:58 steve Exp $"
#endif #endif
/* /*
@ -113,6 +113,20 @@ struct __vpiNull {
}; };
extern struct __vpiNull vpip_null; extern struct __vpiNull vpip_null;
/*
* This type represents the handle to a Verilog scope. These include
* module instantiations and name begin-end blocks. The attach
* function is used to attach handles to the scope by the runtime
* initializaiton.
*/
struct __vpiScope {
struct __vpiHandle base;
/* The scope has a name. (this points to static memory.) */
const char*name;
};
extern void vpip_attach_to_scope(struct __vpiScope*scope, vpiHandle obj);
/* /*
* This structure represents nets and registers. You can tell which by * This structure represents nets and registers. You can tell which by
* the type_code in the base. The bits member points to the actual * the type_code in the base. The bits member points to the actual
@ -181,6 +195,9 @@ struct __vpiNumberConst {
*/ */
extern vpiHandle vpip_make_iterator(unsigned nargs, vpiHandle*args); extern vpiHandle vpip_make_iterator(unsigned nargs, vpiHandle*args);
extern vpiHandle vpip_make_net(struct __vpiSignal*ref, const char*name); extern vpiHandle vpip_make_net(struct __vpiSignal*ref, const char*name);
extern vpiHandle vpip_make_scope(struct __vpiScope*ref,
int type_code,
const char*name);
extern vpiHandle vpip_make_string_const(struct __vpiStringConst*ref, extern vpiHandle vpip_make_string_const(struct __vpiStringConst*ref,
const char*val); const char*val);
extern vpiHandle vpip_make_number_const(struct __vpiNumberConst*ref, extern vpiHandle vpip_make_number_const(struct __vpiNumberConst*ref,
@ -254,6 +271,9 @@ extern int vpip_finished();
/* /*
* $Log: vpi_priv.h,v $ * $Log: vpi_priv.h,v $
* Revision 1.7 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
* Revision 1.6 1999/11/10 02:52:24 steve * Revision 1.6 1999/11/10 02:52:24 steve
* Create the vpiMemory handle type. * Create the vpiMemory handle type.
* *

54
vvm/vpi_scope.c Normal file
View File

@ -0,0 +1,54 @@
/*
* Copyright (c) 1999 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
* General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: vpi_scope.c,v 1.1 1999/11/27 19:07:58 steve Exp $"
#endif
# include "vpi_priv.h"
# include <assert.h>
static const struct __vpirt vpip_module_rt = {
vpiModule,
0,
0,
0,
0,
0
};
vpiHandle vpip_make_scope(struct __vpiScope*ref, int type, const char*name)
{
switch (type) {
case vpiModule:
ref->base.vpi_type = &vpip_module_rt;
break;
default:
assert(0);
}
return &ref->base;
}
/*
* $Log: vpi_scope.c,v $
* Revision 1.1 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
*/

View File

@ -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: xnfio.cc,v 1.8 1999/11/19 05:02:15 steve Exp $" #ident "$Id: xnfio.cc,v 1.9 1999/11/27 19:07:58 steve Exp $"
#endif #endif
# include "functor.h" # include "functor.h"
@ -135,7 +135,7 @@ static NetLogic* make_obuf(Design*des, NetNet*net)
// of the netlist, to create a ring without a signal. Detect // of the netlist, to create a ring without a signal. Detect
// this case and create a new signal. // this case and create a new signal.
if (count_signals(buf->pin(1)) == 0) { if (count_signals(buf->pin(1)) == 0) {
NetNet*tmp = new NetNet(des->local_symbol("$"), NetNet::WIRE); NetNet*tmp = new NetNet(0, des->local_symbol("$"), NetNet::WIRE);
tmp->local_flag(true); tmp->local_flag(true);
connect(buf->pin(1), tmp->pin(0)); connect(buf->pin(1), tmp->pin(0));
des->add_signal(tmp); des->add_signal(tmp);
@ -238,7 +238,7 @@ static void make_ibuf(Design*des, NetNet*net)
// of the netlist, to create a ring without a signal. Detect // of the netlist, to create a ring without a signal. Detect
// this case and create a new signal. // this case and create a new signal.
if (count_signals(buf->pin(0)) == 0) { if (count_signals(buf->pin(0)) == 0) {
NetNet*tmp = new NetNet(des->local_symbol("$"), NetNet::WIRE); NetNet*tmp = new NetNet(0, des->local_symbol("$"), NetNet::WIRE);
connect(buf->pin(0), tmp->pin(0)); connect(buf->pin(0), tmp->pin(0));
des->add_signal(tmp); des->add_signal(tmp);
} }
@ -282,6 +282,9 @@ void xnfio(Design*des)
/* /*
* $Log: xnfio.cc,v $ * $Log: xnfio.cc,v $
* Revision 1.9 1999/11/27 19:07:58 steve
* Support the creation of scopes.
*
* Revision 1.8 1999/11/19 05:02:15 steve * Revision 1.8 1999/11/19 05:02:15 steve
* Handle inverted clock into OUTFF. * Handle inverted clock into OUTFF.
* *