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.
This commit is contained in:
parent
91aad30e1f
commit
e097c999d5
18
PGate.h
18
PGate.h
|
|
@ -19,11 +19,12 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: PGate.h,v 1.1 1998/11/03 23:28:54 steve Exp $"
|
#ident "$Id: PGate.h,v 1.2 1998/12/01 00:42:13 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <vector>
|
# include <vector>
|
||||||
class PExpr;
|
class PExpr;
|
||||||
|
class PUdp;
|
||||||
class Design;
|
class Design;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -111,7 +112,9 @@ class PGBuiltin : public PGate {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This kind of gate is an instantiation of a module. The stored type
|
* This kind of gate is an instantiation of a module. The stored type
|
||||||
* is the name of a module definition somewhere in the pform.
|
* is the name of a module definition somewhere in the pform. This
|
||||||
|
* type als handles UDP devices, because it is generally not known at
|
||||||
|
* parse time whether a name belongs to a module or a UDP.
|
||||||
*/
|
*/
|
||||||
class PGModule : public PGate {
|
class PGModule : public PGate {
|
||||||
|
|
||||||
|
|
@ -125,10 +128,21 @@ class PGModule : public PGate {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
string type_;
|
string type_;
|
||||||
|
|
||||||
|
void elaborate_mod_(Design*, Module*mod, const string&path) const;
|
||||||
|
void elaborate_udp_(Design*, PUdp *udp, const string&path) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: PGate.h,v $
|
* $Log: PGate.h,v $
|
||||||
|
* Revision 1.2 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.
|
||||||
|
*
|
||||||
* Revision 1.1 1998/11/03 23:28:54 steve
|
* Revision 1.1 1998/11/03 23:28:54 steve
|
||||||
* Introduce verilog to CVS.
|
* Introduce verilog to CVS.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
14
PUdp.h
14
PUdp.h
|
|
@ -19,10 +19,12 @@
|
||||||
* 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: PUdp.h,v 1.1 1998/11/25 02:35:53 steve Exp $"
|
#ident "$Id: PUdp.h,v 1.2 1998/12/01 00:42:13 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
# include <map>
|
||||||
# include <vector>
|
# include <vector>
|
||||||
|
# include <string>
|
||||||
# include "verinum.h"
|
# include "verinum.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -61,6 +63,8 @@ class PUdp {
|
||||||
|
|
||||||
verinum::V initial;
|
verinum::V initial;
|
||||||
|
|
||||||
|
map<string,string> attributes;
|
||||||
|
|
||||||
void dump(ostream&out) const;
|
void dump(ostream&out) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -73,6 +77,14 @@ class PUdp {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: PUdp.h,v $
|
* $Log: PUdp.h,v $
|
||||||
|
* Revision 1.2 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.
|
||||||
|
*
|
||||||
* Revision 1.1 1998/11/25 02:35:53 steve
|
* Revision 1.1 1998/11/25 02:35:53 steve
|
||||||
* Parse UDP primitives all the way to pform.
|
* Parse UDP primitives all the way to pform.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
10
README.txt
10
README.txt
|
|
@ -69,6 +69,16 @@ Attributes are [<key> <value>] pairs and are used to communicate with
|
||||||
the various processing steps. See the documentation for the processing
|
the various processing steps. See the documentation for the processing
|
||||||
step for a list of the pertinent attributes.
|
step for a list of the pertinent attributes.
|
||||||
|
|
||||||
|
Attributes can also be applied to gate types. When this is done, the
|
||||||
|
attribute is given to every instantiation of the primitive. The syntax
|
||||||
|
for the attribute statement is the same, except that the <identifier>
|
||||||
|
names a primitive earlier in the compilation unit and the statement is
|
||||||
|
placed in global scope, instead of within a module. The semicolon is
|
||||||
|
not part of a type attribute.
|
||||||
|
|
||||||
|
Currently, type attributes are only supported for UDP types.
|
||||||
|
|
||||||
|
|
||||||
HOW IT WORKS -- STAGES OF PROCESSING
|
HOW IT WORKS -- STAGES OF PROCESSING
|
||||||
|
|
||||||
* Parse
|
* Parse
|
||||||
|
|
|
||||||
|
|
@ -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.4 1998/11/23 00:20:22 steve Exp $"
|
#ident "$Id: design_dump.cc,v 1.5 1998/12/01 00:42:13 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -28,21 +28,6 @@
|
||||||
# include <iomanip>
|
# include <iomanip>
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
||||||
static ostream& operator<< (ostream&o, NetNet::Type t)
|
|
||||||
{
|
|
||||||
switch (t) {
|
|
||||||
case NetNet::IMPLICIT:
|
|
||||||
o << "implicit wire";
|
|
||||||
break;
|
|
||||||
case NetNet::WIRE:
|
|
||||||
o << "wire";
|
|
||||||
break;
|
|
||||||
case NetNet::REG:
|
|
||||||
o << "reg";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ostream& operator<< (ostream&o, NetBlock::Type t)
|
static ostream& operator<< (ostream&o, NetBlock::Type t)
|
||||||
{
|
{
|
||||||
|
|
@ -164,6 +149,17 @@ void NetLogic::dump_node(ostream&o, unsigned ind) const
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
dump_node_pins(o, ind+4);
|
dump_node_pins(o, ind+4);
|
||||||
|
dump_obj_attr(o, ind+4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetUDP::dump_node(ostream&o, unsigned ind) const
|
||||||
|
{
|
||||||
|
o << setw(ind) << "" << "UDP: ";
|
||||||
|
o << " #(" << delay1() << "," << delay2() << "," << delay3() <<
|
||||||
|
") " << name() << endl;
|
||||||
|
|
||||||
|
dump_node_pins(o, ind+4);
|
||||||
|
dump_obj_attr(o, ind+4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPEvent::dump_node(ostream&o, unsigned ind) const
|
void NetPEvent::dump_node(ostream&o, unsigned ind) const
|
||||||
|
|
@ -396,6 +392,14 @@ void Design::dump(ostream&o) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: design_dump.cc,v $
|
* $Log: design_dump.cc,v $
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
* Revision 1.4 1998/11/23 00:20:22 steve
|
* Revision 1.4 1998/11/23 00:20:22 steve
|
||||||
* NetAssign handles lvalues as pin links
|
* NetAssign handles lvalues as pin links
|
||||||
* instead of a signal pointer,
|
* instead of a signal pointer,
|
||||||
|
|
|
||||||
96
elaborate.cc
96
elaborate.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: elaborate.cc,v 1.6 1998/11/23 00:20:22 steve Exp $"
|
#ident "$Id: elaborate.cc,v 1.7 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -89,7 +89,8 @@ static void do_assign(Design*des, const string&path,
|
||||||
// Urff, I don't like this global variable. I *will* figure out a
|
// Urff, I don't like this global variable. I *will* figure out a
|
||||||
// way to get rid of it. But, for now the PGModule::elaborate method
|
// way to get rid of it. But, for now the PGModule::elaborate method
|
||||||
// needs it to find the module definition.
|
// needs it to find the module definition.
|
||||||
static const list<Module*>* modlist = 0;
|
static const map<string,Module*>* modlist = 0;
|
||||||
|
static const map<string,PUdp*>* udplist = 0;
|
||||||
|
|
||||||
/* Elaborate a source wire. Generally pretty easy. */
|
/* Elaborate a source wire. Generally pretty easy. */
|
||||||
void PWire::elaborate(Design*des, const string&path) const
|
void PWire::elaborate(Design*des, const string&path) const
|
||||||
|
|
@ -201,25 +202,8 @@ void PGBuiltin::elaborate(Design*des, const string&path) const
|
||||||
* the parameters. This is done with BUFZ gates so that they look just
|
* the parameters. This is done with BUFZ gates so that they look just
|
||||||
* like continuous assignment connections.
|
* like continuous assignment connections.
|
||||||
*/
|
*/
|
||||||
void PGModule::elaborate(Design*des, const string&path) const
|
void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const
|
||||||
{
|
{
|
||||||
// Look for the module type
|
|
||||||
Module*rmod = 0;
|
|
||||||
for (list<Module*>::const_iterator mod = modlist->begin()
|
|
||||||
; mod != modlist->end()
|
|
||||||
; mod ++ ) {
|
|
||||||
|
|
||||||
if ((*mod)->get_name() == type_) {
|
|
||||||
rmod = *mod;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rmod == 0) {
|
|
||||||
cerr << "Unknown module: " << type_ << endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
string my_name;
|
string my_name;
|
||||||
if (get_name() == "")
|
if (get_name() == "")
|
||||||
my_name = local_symbol(path);
|
my_name = local_symbol(path);
|
||||||
|
|
@ -269,6 +253,48 @@ void PGModule::elaborate(Design*des, const string&path) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PGModule::elaborate_udp_(Design*des, PUdp*udp, const string&path) const
|
||||||
|
{
|
||||||
|
const string my_name = path+"."+get_name();
|
||||||
|
NetUDP*net = new NetUDP(my_name, udp->ports.size());
|
||||||
|
net->set_attributes(udp->attributes);
|
||||||
|
|
||||||
|
for (unsigned idx = 0 ; idx < net->pin_count() ; idx += 1) {
|
||||||
|
NetNet*sig = pin(idx)->elaborate_net(des, path);
|
||||||
|
if (sig == 0) {
|
||||||
|
cerr << "Expression too complicated for elaboration:"
|
||||||
|
<< *pin(idx) << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(sig->pin(0), net->pin(idx));
|
||||||
|
|
||||||
|
if (NetTmp*tmp = dynamic_cast<NetTmp*>(sig))
|
||||||
|
delete tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
des->add_node(net);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PGModule::elaborate(Design*des, const string&path) const
|
||||||
|
{
|
||||||
|
// Look for the module type
|
||||||
|
map<string,Module*>::const_iterator mod = modlist->find(type_);
|
||||||
|
if (mod != modlist->end()) {
|
||||||
|
elaborate_mod_(des, (*mod).second, path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try a primitive type
|
||||||
|
map<string,PUdp*>::const_iterator udp = udplist->find(type_);
|
||||||
|
if (udp != udplist->end()) {
|
||||||
|
elaborate_udp_(des, (*udp).second, path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cerr << "Unknown module: " << type_ << endl;
|
||||||
|
}
|
||||||
|
|
||||||
NetNet* PExpr::elaborate_net(Design*des, const string&path) const
|
NetNet* PExpr::elaborate_net(Design*des, const string&path) const
|
||||||
{
|
{
|
||||||
cerr << "Don't know how to elaborate `" << *this << "' as gates." << endl;
|
cerr << "Don't know how to elaborate `" << *this << "' as gates." << endl;
|
||||||
|
|
@ -676,30 +702,26 @@ void Module::elaborate(Design*des, const string&path) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Design* elaborate(const list<Module*>&modules, const string&root)
|
Design* elaborate(const map<string,Module*>&modules,
|
||||||
|
const map<string,PUdp*>&primitives,
|
||||||
|
const string&root)
|
||||||
{
|
{
|
||||||
// Look for the root module in the list.
|
// Look for the root module in the list.
|
||||||
Module*rmod = 0;
|
map<string,Module*>::const_iterator mod = modules.find(root);
|
||||||
for (list<Module*>::const_iterator mod = modules.begin()
|
if (mod == modules.end())
|
||||||
; mod != modules.end()
|
|
||||||
; mod ++ ) {
|
|
||||||
|
|
||||||
if ((*mod)->get_name() == root) {
|
|
||||||
rmod = *mod;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rmod == 0)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Module*rmod = (*mod).second;
|
||||||
|
|
||||||
// This is the output design. I fill it in as I scan the root
|
// This is the output design. I fill it in as I scan the root
|
||||||
// module and elaborate what I find.
|
// module and elaborate what I find.
|
||||||
Design*des = new Design;
|
Design*des = new Design;
|
||||||
|
|
||||||
modlist = &modules;
|
modlist = &modules;
|
||||||
|
udplist = &primitives;
|
||||||
rmod->elaborate(des, root);
|
rmod->elaborate(des, root);
|
||||||
modlist = 0;
|
modlist = 0;
|
||||||
|
udplist = 0;
|
||||||
|
|
||||||
return des;
|
return des;
|
||||||
}
|
}
|
||||||
|
|
@ -707,6 +729,14 @@ Design* elaborate(const list<Module*>&modules, const string&root)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elaborate.cc,v $
|
* $Log: elaborate.cc,v $
|
||||||
|
* Revision 1.7 1998/12/01 00:42:14 steve
|
||||||
|
* Elaborate UDP devices,
|
||||||
|
* Support UDP type attributes, and
|
||||||
|
* pass those attributes to nodes that
|
||||||
|
* are instantiated by elaboration,
|
||||||
|
* Put modules into a map instead of
|
||||||
|
* a simple list.
|
||||||
|
*
|
||||||
* Revision 1.6 1998/11/23 00:20:22 steve
|
* Revision 1.6 1998/11/23 00:20:22 steve
|
||||||
* NetAssign handles lvalues as pin links
|
* NetAssign handles lvalues as pin links
|
||||||
* instead of a signal pointer,
|
* instead of a signal pointer,
|
||||||
|
|
|
||||||
15
emit.cc
15
emit.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: emit.cc,v 1.3 1998/11/09 18:55:34 steve Exp $"
|
#ident "$Id: emit.cc,v 1.4 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -40,6 +40,11 @@ void NetLogic::emit_node(ostream&o, struct target_t*tgt) const
|
||||||
tgt->logic(o, this);
|
tgt->logic(o, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetUDP::emit_node(ostream&o, struct target_t*tgt) const
|
||||||
|
{
|
||||||
|
tgt->udp(o, this);
|
||||||
|
}
|
||||||
|
|
||||||
void NetAssign::emit_node(ostream&o, struct target_t*tgt) const
|
void NetAssign::emit_node(ostream&o, struct target_t*tgt) const
|
||||||
{
|
{
|
||||||
tgt->net_assign(o, this);
|
tgt->net_assign(o, this);
|
||||||
|
|
@ -218,6 +223,14 @@ void emit(ostream&o, const Design*des, const char*type)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: emit.cc,v $
|
* $Log: emit.cc,v $
|
||||||
|
* Revision 1.4 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.3 1998/11/09 18:55:34 steve
|
* Revision 1.3 1998/11/09 18:55:34 steve
|
||||||
* Add procedural while loops,
|
* Add procedural while loops,
|
||||||
* Parse procedural for loops,
|
* Parse procedural for loops,
|
||||||
|
|
|
||||||
29
main.cc
29
main.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: main.cc,v 1.6 1998/11/25 02:35:53 steve Exp $"
|
#ident "$Id: main.cc,v 1.7 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
@ -55,7 +55,9 @@ static void parm_to_flagmap(const string&flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern Design* elaborate(const list<Module*>&modules, const string&root);
|
extern Design* elaborate(const map<string,Module*>&modules,
|
||||||
|
const map<string,PUdp*>&primitives,
|
||||||
|
const string&root);
|
||||||
extern void emit(ostream&o, const Design*, const char*);
|
extern void emit(ostream&o, const Design*, const char*);
|
||||||
|
|
||||||
extern void cprop(Design*des);
|
extern void cprop(Design*des);
|
||||||
|
|
@ -154,8 +156,8 @@ int main(int argc, char*argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the input. Make the pform. */
|
/* Parse the input. Make the pform. */
|
||||||
list<Module*>modules;
|
map<string,Module*> modules;
|
||||||
map<string,PUdp*>primitives;
|
map<string,PUdp*> primitives;
|
||||||
int rc = pform_parse(input, modules, primitives);
|
int rc = pform_parse(input, modules, primitives);
|
||||||
|
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
|
@ -165,10 +167,10 @@ int main(int argc, char*argv[])
|
||||||
if (dump_flag) {
|
if (dump_flag) {
|
||||||
ofstream out ("a.pf");
|
ofstream out ("a.pf");
|
||||||
out << "PFORM DUMP MODULES:" << endl;
|
out << "PFORM DUMP MODULES:" << endl;
|
||||||
for (list<Module*>::iterator mod = modules.begin()
|
for (map<string,Module*>::iterator mod = modules.begin()
|
||||||
; mod != modules.end()
|
; mod != modules.end()
|
||||||
; mod ++ ) {
|
; mod ++ ) {
|
||||||
pform_dump(out, *mod);
|
pform_dump(out, (*mod).second);
|
||||||
}
|
}
|
||||||
out << "PFORM DUMP PRIMITIVES:" << endl;
|
out << "PFORM DUMP PRIMITIVES:" << endl;
|
||||||
for (map<string,PUdp*>::iterator idx = primitives.begin()
|
for (map<string,PUdp*>::iterator idx = primitives.begin()
|
||||||
|
|
@ -180,12 +182,11 @@ int main(int argc, char*argv[])
|
||||||
|
|
||||||
|
|
||||||
/* Select a root module, and elaborate the design. */
|
/* Select a root module, and elaborate the design. */
|
||||||
if ((start_module == "") && (modules.size() == 1)) {
|
if (start_module == "") {
|
||||||
Module*mod = modules.front();
|
start_module = "main";
|
||||||
start_module = mod->get_name();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Design*des = elaborate(modules, start_module);
|
Design*des = elaborate(modules, primitives, start_module);
|
||||||
if (des == 0) {
|
if (des == 0) {
|
||||||
cerr << "Unable to elaborate design." << endl;
|
cerr << "Unable to elaborate design." << endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -226,6 +227,14 @@ int main(int argc, char*argv[])
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: main.cc,v $
|
* $Log: main.cc,v $
|
||||||
|
* Revision 1.7 1998/12/01 00:42:14 steve
|
||||||
|
* Elaborate UDP devices,
|
||||||
|
* Support UDP type attributes, and
|
||||||
|
* pass those attributes to nodes that
|
||||||
|
* are instantiated by elaboration,
|
||||||
|
* Put modules into a map instead of
|
||||||
|
* a simple list.
|
||||||
|
*
|
||||||
* Revision 1.6 1998/11/25 02:35:53 steve
|
* Revision 1.6 1998/11/25 02:35:53 steve
|
||||||
* Parse UDP primitives all the way to pform.
|
* Parse UDP primitives all the way to pform.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
54
netlist.cc
54
netlist.cc
|
|
@ -17,13 +17,57 @@
|
||||||
* 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.8 1998/11/23 00:20:23 steve Exp $"
|
#ident "$Id: netlist.cc,v 1.9 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <cassert>
|
# include <cassert>
|
||||||
# include <typeinfo>
|
# include <typeinfo>
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
||||||
|
ostream& operator<< (ostream&o, NetNet::Type t)
|
||||||
|
{
|
||||||
|
switch (t) {
|
||||||
|
case NetNet::IMPLICIT:
|
||||||
|
o << "wire /*implicit*/";
|
||||||
|
break;
|
||||||
|
case NetNet::REG:
|
||||||
|
o << "reg";
|
||||||
|
break;
|
||||||
|
case NetNet::SUPPLY0:
|
||||||
|
o << "supply0";
|
||||||
|
break;
|
||||||
|
case NetNet::SUPPLY1:
|
||||||
|
o << "supply1";
|
||||||
|
break;
|
||||||
|
case NetNet::TRI:
|
||||||
|
o << "tri";
|
||||||
|
break;
|
||||||
|
case NetNet::TRI0:
|
||||||
|
o << "tri0";
|
||||||
|
break;
|
||||||
|
case NetNet::TRI1:
|
||||||
|
o << "tri1";
|
||||||
|
break;
|
||||||
|
case NetNet::TRIAND:
|
||||||
|
o << "triand";
|
||||||
|
break;
|
||||||
|
case NetNet::TRIOR:
|
||||||
|
o << "trior";
|
||||||
|
break;
|
||||||
|
case NetNet::WAND:
|
||||||
|
o << "wand";
|
||||||
|
break;
|
||||||
|
case NetNet::WOR:
|
||||||
|
o << "wor";
|
||||||
|
break;
|
||||||
|
case NetNet::WIRE:
|
||||||
|
o << "wire";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void connect(NetObj::Link&l, NetObj::Link&r)
|
void connect(NetObj::Link&l, NetObj::Link&r)
|
||||||
{
|
{
|
||||||
NetObj::Link* cur = &l;
|
NetObj::Link* cur = &l;
|
||||||
|
|
@ -452,6 +496,14 @@ NetNet* Design::find_signal(bool (*func)(const NetNet*))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.cc,v $
|
* $Log: netlist.cc,v $
|
||||||
|
* 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
|
* Revision 1.8 1998/11/23 00:20:23 steve
|
||||||
* NetAssign handles lvalues as pin links
|
* NetAssign handles lvalues as pin links
|
||||||
* instead of a signal pointer,
|
* instead of a signal pointer,
|
||||||
|
|
|
||||||
28
netlist.h
28
netlist.h
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: netlist.h,v 1.8 1998/11/23 00:20:23 steve Exp $"
|
#ident "$Id: netlist.h,v 1.9 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -307,6 +307,22 @@ class NetLogic : public NetNode {
|
||||||
const TYPE type_;
|
const TYPE type_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The UDP is a User Defined Primitive from the Verilog source. Do not
|
||||||
|
* expand it out any further then this in the netlist, as this can be
|
||||||
|
* used to represent target device primitives.
|
||||||
|
*/
|
||||||
|
class NetUDP : public NetNode {
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit NetUDP(const string&n, unsigned pins)
|
||||||
|
: NetNode(n, pins) { }
|
||||||
|
|
||||||
|
|
||||||
|
virtual void emit_node(ostream&, struct target_t*) const;
|
||||||
|
virtual void dump_node(ostream&, unsigned ind) const;
|
||||||
|
};
|
||||||
|
|
||||||
/* =========
|
/* =========
|
||||||
* A process is a behavioral-model description. A process is a
|
* A process is a behavioral-model description. A process is a
|
||||||
* statement that may be compound. the various statement types may
|
* statement that may be compound. the various statement types may
|
||||||
|
|
@ -753,8 +769,18 @@ const NetNet* find_link_signal(const NetObj*net, unsigned pin,
|
||||||
inline ostream& operator << (ostream&o, const NetExpr&exp)
|
inline ostream& operator << (ostream&o, const NetExpr&exp)
|
||||||
{ exp.dump(o); return o; }
|
{ exp.dump(o); return o; }
|
||||||
|
|
||||||
|
extern ostream& operator << (ostream&, NetNet::Type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.h,v $
|
* $Log: netlist.h,v $
|
||||||
|
* 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
|
* Revision 1.8 1998/11/23 00:20:23 steve
|
||||||
* NetAssign handles lvalues as pin links
|
* NetAssign handles lvalues as pin links
|
||||||
* instead of a signal pointer,
|
* instead of a signal pointer,
|
||||||
|
|
|
||||||
8
parse.y
8
parse.y
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: parse.y,v 1.7 1998/11/25 02:35:53 steve Exp $"
|
#ident "$Id: parse.y,v 1.8 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "parse_misc.h"
|
# include "parse_misc.h"
|
||||||
|
|
@ -151,6 +151,12 @@ delay_opt
|
||||||
description
|
description
|
||||||
: module
|
: module
|
||||||
| udp_primitive
|
| udp_primitive
|
||||||
|
| KK_attribute '(' IDENTIFIER ',' STRING ',' STRING ')'
|
||||||
|
{ pform_set_type_attrib(*$3, *$5, *$7);
|
||||||
|
delete $3;
|
||||||
|
delete $5;
|
||||||
|
delete $7;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
event_control
|
event_control
|
||||||
|
|
|
||||||
36
pform.cc
36
pform.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: pform.cc,v 1.5 1998/11/25 02:35:53 steve Exp $"
|
#ident "$Id: pform.cc,v 1.6 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "pform.h"
|
# include "pform.h"
|
||||||
|
|
@ -32,7 +32,7 @@ extern int VLparse();
|
||||||
|
|
||||||
static Module*cur_module = 0;
|
static Module*cur_module = 0;
|
||||||
|
|
||||||
static list<Module*>*vl_modules = 0;
|
static map<string,Module*> vl_modules;
|
||||||
static map<string,PUdp*> vl_primitives;
|
static map<string,PUdp*> vl_primitives;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -55,8 +55,6 @@ void pform_startmodule(const string&name, list<PWire*>*ports)
|
||||||
assert( cur_module == 0 );
|
assert( cur_module == 0 );
|
||||||
cur_module = new Module(name, ports? ports->size() : 0);
|
cur_module = new Module(name, ports? ports->size() : 0);
|
||||||
|
|
||||||
vl_modules->push_back(cur_module);
|
|
||||||
|
|
||||||
if (ports) {
|
if (ports) {
|
||||||
unsigned idx = 0;
|
unsigned idx = 0;
|
||||||
for (list<PWire*>::iterator cur = ports->begin()
|
for (list<PWire*>::iterator cur = ports->begin()
|
||||||
|
|
@ -74,6 +72,7 @@ void pform_endmodule(const string&name)
|
||||||
{
|
{
|
||||||
assert(cur_module);
|
assert(cur_module);
|
||||||
assert(name == cur_module->get_name());
|
assert(name == cur_module->get_name());
|
||||||
|
vl_modules[name] = cur_module;
|
||||||
cur_module = 0;
|
cur_module = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -350,6 +349,22 @@ void pform_set_attrib(const string&name, const string&key, const string&value)
|
||||||
cur->attributes[key] = value;
|
cur->attributes[key] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the attribute of a TYPE. This is different from an object in
|
||||||
|
* that this applies to every instantiation of the given type.
|
||||||
|
*/
|
||||||
|
void pform_set_type_attrib(const string&name, const string&key,
|
||||||
|
const string&value)
|
||||||
|
{
|
||||||
|
map<string,PUdp*>::const_iterator udp = vl_primitives.find(name);
|
||||||
|
if (udp == vl_primitives.end()) {
|
||||||
|
VLerror("type name is not (yet) defined.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*udp).second ->attributes[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
static void pform_set_net_range(const string&name, list<PExpr*>*range)
|
static void pform_set_net_range(const string&name, list<PExpr*>*range)
|
||||||
{
|
{
|
||||||
assert(range->size() == 2);
|
assert(range->size() == 2);
|
||||||
|
|
@ -448,10 +463,10 @@ Statement* pform_make_calltask(string*name, list<PExpr*>*parms)
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE*vl_input = 0;
|
FILE*vl_input = 0;
|
||||||
int pform_parse(FILE*input, list<Module*>&modules, map<string,PUdp*>&prim)
|
int pform_parse(FILE*input, map<string,Module*>&modules,
|
||||||
|
map<string,PUdp*>&prim)
|
||||||
{
|
{
|
||||||
vl_input = input;
|
vl_input = input;
|
||||||
vl_modules = &modules;
|
|
||||||
error_count = 0;
|
error_count = 0;
|
||||||
warn_count = 0;
|
warn_count = 0;
|
||||||
int rc = VLparse();
|
int rc = VLparse();
|
||||||
|
|
@ -459,6 +474,7 @@ int pform_parse(FILE*input, list<Module*>&modules, map<string,PUdp*>&prim)
|
||||||
cerr << "I give up." << endl;
|
cerr << "I give up." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
modules = vl_modules;
|
||||||
prim = vl_primitives;
|
prim = vl_primitives;
|
||||||
return error_count;
|
return error_count;
|
||||||
}
|
}
|
||||||
|
|
@ -466,6 +482,14 @@ int pform_parse(FILE*input, list<Module*>&modules, map<string,PUdp*>&prim)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform.cc,v $
|
* $Log: pform.cc,v $
|
||||||
|
* Revision 1.6 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.5 1998/11/25 02:35:53 steve
|
* Revision 1.5 1998/11/25 02:35:53 steve
|
||||||
* Parse UDP primitives all the way to pform.
|
* Parse UDP primitives all the way to pform.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
15
pform.h
15
pform.h
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: pform.h,v 1.3 1998/11/25 02:35:53 steve Exp $"
|
#ident "$Id: pform.h,v 1.4 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -92,6 +92,8 @@ extern void pform_set_port_type(list<string>*names, NetNet::PortType);
|
||||||
extern void pform_set_net_range(list<string>*names, list<PExpr*>*);
|
extern void pform_set_net_range(list<string>*names, list<PExpr*>*);
|
||||||
extern void pform_set_attrib(const string&name, const string&key,
|
extern void pform_set_attrib(const string&name, const string&key,
|
||||||
const string&value);
|
const string&value);
|
||||||
|
extern void pform_set_type_attrib(const string&name, const string&key,
|
||||||
|
const string&value);
|
||||||
extern void pform_make_behavior(PProcess::Type, Statement*);
|
extern void pform_make_behavior(PProcess::Type, Statement*);
|
||||||
extern Statement* pform_make_block(PBlock::BL_TYPE, list<Statement*>*);
|
extern Statement* pform_make_block(PBlock::BL_TYPE, list<Statement*>*);
|
||||||
extern Statement* pform_make_assignment(string*t, PExpr*e);
|
extern Statement* pform_make_assignment(string*t, PExpr*e);
|
||||||
|
|
@ -124,11 +126,20 @@ extern void pform_make_pgassign(const string&lval, PExpr*sel, PExpr*rval);
|
||||||
* parses the source file and places all the modules it finds into the
|
* parses the source file and places all the modules it finds into the
|
||||||
* mod list. The dump function dumps a module to the output stream.
|
* mod list. The dump function dumps a module to the output stream.
|
||||||
*/
|
*/
|
||||||
extern int pform_parse(FILE*, list<Module*>&mod, map<string,PUdp*>&prim);
|
extern int pform_parse(FILE*, map<string,Module*>&mod,
|
||||||
|
map<string,PUdp*>&prim);
|
||||||
extern void pform_dump(ostream&out, Module*mod);
|
extern void pform_dump(ostream&out, Module*mod);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform.h,v $
|
* $Log: pform.h,v $
|
||||||
|
* Revision 1.4 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.3 1998/11/25 02:35:53 steve
|
* Revision 1.3 1998/11/25 02:35:53 steve
|
||||||
* Parse UDP primitives all the way to pform.
|
* Parse UDP primitives all the way to pform.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: pform_dump.cc,v 1.6 1998/11/25 02:35:54 steve Exp $"
|
#ident "$Id: pform_dump.cc,v 1.7 1998/12/01 00:42:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -95,17 +95,7 @@ void PEBinary::dump(ostream&out) const
|
||||||
|
|
||||||
void PWire::dump(ostream&out) const
|
void PWire::dump(ostream&out) const
|
||||||
{
|
{
|
||||||
switch (type) {
|
out << " " << type;
|
||||||
case NetNet::IMPLICIT:
|
|
||||||
out << " implicit wire ";
|
|
||||||
break;
|
|
||||||
case NetNet::WIRE:
|
|
||||||
out << " wire ";
|
|
||||||
break;
|
|
||||||
case NetNet::REG:
|
|
||||||
out << " reg ";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (port_type) {
|
switch (port_type) {
|
||||||
case NetNet::PIMPLICIT:
|
case NetNet::PIMPLICIT:
|
||||||
|
|
@ -360,11 +350,28 @@ void PUdp::dump(ostream&out) const
|
||||||
<< ";" << endl;
|
<< ";" << endl;
|
||||||
|
|
||||||
out << "endprimitive" << endl;
|
out << "endprimitive" << endl;
|
||||||
|
|
||||||
|
// Dump the attributes for the primitive as attribute
|
||||||
|
// statements.
|
||||||
|
for (map<string,string>::const_iterator idx = attributes.begin()
|
||||||
|
; idx != attributes.end()
|
||||||
|
; idx ++) {
|
||||||
|
out << "$attribute(" << name_ << ", \"" << (*idx).first <<
|
||||||
|
"\", \"" << (*idx).second << "\")" << endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform_dump.cc,v $
|
* $Log: pform_dump.cc,v $
|
||||||
|
* Revision 1.7 1998/12/01 00:42:14 steve
|
||||||
|
* Elaborate UDP devices,
|
||||||
|
* Support UDP type attributes, and
|
||||||
|
* pass those attributes to nodes that
|
||||||
|
* are instantiated by elaboration,
|
||||||
|
* Put modules into a map instead of
|
||||||
|
* a simple list.
|
||||||
|
*
|
||||||
* Revision 1.6 1998/11/25 02:35:54 steve
|
* Revision 1.6 1998/11/25 02:35:54 steve
|
||||||
* Parse UDP primitives all the way to pform.
|
* Parse UDP primitives all the way to pform.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
23
t-verilog.cc
23
t-verilog.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: t-verilog.cc,v 1.2 1998/11/23 00:20:23 steve Exp $"
|
#ident "$Id: t-verilog.cc,v 1.3 1998/12/01 00:42:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -56,19 +56,6 @@ class target_verilog : public target_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static ostream& operator<< (ostream&o, NetNet::Type t)
|
|
||||||
{
|
|
||||||
switch (t) {
|
|
||||||
case NetNet::WIRE:
|
|
||||||
o << "wire";
|
|
||||||
break;
|
|
||||||
case NetNet::REG:
|
|
||||||
o << "reg";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The output of the design starts here. The emit operation calls the
|
* The output of the design starts here. The emit operation calls the
|
||||||
* design_start and design_end target methods around the scan of the
|
* design_start and design_end target methods around the scan of the
|
||||||
|
|
@ -307,6 +294,14 @@ const struct target tgt_verilog = {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: t-verilog.cc,v $
|
* $Log: t-verilog.cc,v $
|
||||||
|
* Revision 1.3 1998/12/01 00:42:15 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.2 1998/11/23 00:20:23 steve
|
* Revision 1.2 1998/11/23 00:20:23 steve
|
||||||
* NetAssign handles lvalues as pin links
|
* NetAssign handles lvalues as pin links
|
||||||
* instead of a signal pointer,
|
* instead of a signal pointer,
|
||||||
|
|
|
||||||
16
target.cc
16
target.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: target.cc,v 1.3 1998/11/09 18:55:34 steve Exp $"
|
#ident "$Id: target.cc,v 1.4 1998/12/01 00:42:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "target.h"
|
# include "target.h"
|
||||||
|
|
@ -45,6 +45,12 @@ void target_t::bufz(ostream&os, const NetBUFZ*)
|
||||||
"Unhandled continuous assign (BUFZ)." << endl;
|
"Unhandled continuous assign (BUFZ)." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void target_t::udp(ostream&os, const NetUDP*)
|
||||||
|
{
|
||||||
|
cerr << "target (" << typeid(*this).name() << "): "
|
||||||
|
"Unhandled UDP." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
void target_t::net_assign(ostream&os, const NetAssign*)
|
void target_t::net_assign(ostream&os, const NetAssign*)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -147,6 +153,14 @@ void expr_scan_t::expr_binary(const NetEBinary*ex)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: target.cc,v $
|
* $Log: target.cc,v $
|
||||||
|
* Revision 1.4 1998/12/01 00:42:15 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.3 1998/11/09 18:55:34 steve
|
* Revision 1.3 1998/11/09 18:55:34 steve
|
||||||
* Add procedural while loops,
|
* Add procedural while loops,
|
||||||
* Parse procedural for loops,
|
* Parse procedural for loops,
|
||||||
|
|
|
||||||
11
target.h
11
target.h
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: target.h,v 1.3 1998/11/09 18:55:35 steve Exp $"
|
#ident "$Id: target.h,v 1.4 1998/12/01 00:42:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -61,6 +61,7 @@ struct target_t {
|
||||||
/* Output a gate (called for each gate) */
|
/* Output a gate (called for each gate) */
|
||||||
virtual void logic(ostream&os, const NetLogic*);
|
virtual void logic(ostream&os, const NetLogic*);
|
||||||
virtual void bufz(ostream&os, const NetBUFZ*);
|
virtual void bufz(ostream&os, const NetBUFZ*);
|
||||||
|
virtual void udp(ostream&os, const NetUDP*);
|
||||||
virtual void net_assign(ostream&os, const NetAssign*);
|
virtual void net_assign(ostream&os, const NetAssign*);
|
||||||
virtual void net_const(ostream&os, const NetConst*);
|
virtual void net_const(ostream&os, const NetConst*);
|
||||||
virtual void net_pevent(ostream&os, const NetPEvent*);
|
virtual void net_pevent(ostream&os, const NetPEvent*);
|
||||||
|
|
@ -113,6 +114,14 @@ extern const struct target *target_table[];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: target.h,v $
|
* $Log: target.h,v $
|
||||||
|
* Revision 1.4 1998/12/01 00:42:15 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.3 1998/11/09 18:55:35 steve
|
* Revision 1.3 1998/11/09 18:55:35 steve
|
||||||
* Add procedural while loops,
|
* Add procedural while loops,
|
||||||
* Parse procedural for loops,
|
* Parse procedural for loops,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue