Parameter overrides support from Peter Monta
AND and XOR support wide expressions.
This commit is contained in:
parent
0175a4fce0
commit
9eae940ebd
16
Module.h
16
Module.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: Module.h,v 1.8 1999/08/04 02:13:02 steve Exp $"
|
||||
#ident "$Id: Module.h,v 1.9 1999/08/23 16:48:39 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include <list>
|
||||
|
|
@ -64,6 +64,14 @@ class Module {
|
|||
into this map. */
|
||||
map<string,PExpr*>parameters;
|
||||
|
||||
/* Parameters may be overridden at instantiation time;
|
||||
the overrides do not contain explicit parameter names,
|
||||
but rather refer to parameters in the order they
|
||||
appear in the instantiated module. Therefore a
|
||||
list of names in module-order is needed to pass from
|
||||
a parameter-index to its name. */
|
||||
list<string> param_names;
|
||||
|
||||
const string&get_name() const { return name_; }
|
||||
|
||||
void add_gate(PGate*gate);
|
||||
|
|
@ -85,7 +93,7 @@ class Module {
|
|||
const list<PProcess*>& get_behaviors() const { return behaviors_; }
|
||||
|
||||
void dump(ostream&out) const;
|
||||
bool elaborate(Design*, const string&path) const;
|
||||
bool elaborate(Design*, const string&path, svector<PExpr*>*overrides_) const;
|
||||
|
||||
private:
|
||||
const string name_;
|
||||
|
|
@ -105,6 +113,10 @@ class Module {
|
|||
|
||||
/*
|
||||
* $Log: Module.h,v $
|
||||
* Revision 1.9 1999/08/23 16:48:39 steve
|
||||
* Parameter overrides support from Peter Monta
|
||||
* AND and XOR support wide expressions.
|
||||
*
|
||||
* Revision 1.8 1999/08/04 02:13:02 steve
|
||||
* Elaborate module ports that are concatenations of
|
||||
* module signals.
|
||||
|
|
|
|||
15
PGate.h
15
PGate.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: PGate.h,v 1.8 1999/08/01 21:18:55 steve Exp $"
|
||||
#ident "$Id: PGate.h,v 1.9 1999/08/23 16:48:39 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "svector.h"
|
||||
|
|
@ -150,8 +150,8 @@ class PGModule : public PGate {
|
|||
// If the binding of ports is by position, this constructor
|
||||
// builds everything all at once.
|
||||
explicit PGModule(const string&type, const string&name,
|
||||
svector<PExpr*>*pins)
|
||||
: PGate(name, pins), type_(type), pins_(0), npins_(0) { }
|
||||
svector<PExpr*>*overrides, svector<PExpr*>*pins)
|
||||
: PGate(name, pins), type_(type), overrides_(overrides), pins_(0), npins_(0) { }
|
||||
|
||||
// If the binding of ports is by name, this constructor takes
|
||||
// the bindings and stores them for later elaboration.
|
||||
|
|
@ -160,8 +160,8 @@ class PGModule : public PGate {
|
|||
PExpr* parm;
|
||||
};
|
||||
explicit PGModule(const string&type, const string&name,
|
||||
bind_t*pins, unsigned npins)
|
||||
: PGate(name, 0), type_(type), pins_(pins), npins_(npins) { }
|
||||
svector<PExpr*>*overrides, bind_t*pins, unsigned npins)
|
||||
: PGate(name, 0), type_(type), overrides_(overrides), pins_(pins), npins_(npins) { }
|
||||
|
||||
|
||||
virtual void dump(ostream&out) const;
|
||||
|
|
@ -169,6 +169,7 @@ class PGModule : public PGate {
|
|||
|
||||
private:
|
||||
string type_;
|
||||
svector<PExpr*>*overrides_;
|
||||
bind_t*pins_;
|
||||
unsigned npins_;
|
||||
|
||||
|
|
@ -178,6 +179,10 @@ class PGModule : public PGate {
|
|||
|
||||
/*
|
||||
* $Log: PGate.h,v $
|
||||
* Revision 1.9 1999/08/23 16:48:39 steve
|
||||
* Parameter overrides support from Peter Monta
|
||||
* AND and XOR support wide expressions.
|
||||
*
|
||||
* Revision 1.8 1999/08/01 21:18:55 steve
|
||||
* elaborate rise/fall/decay for continuous assign.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -292,6 +292,7 @@ especially testing from many people, including (in alphabetical order):
|
|||
Larry Doolittle <LRDoolittle@lbl.gov>
|
||||
Ales Hvezda <ahvezda@seul.org>
|
||||
James Lee <jml@seva.com>
|
||||
Peter Monta <pmonta@halibut.imedia.com>
|
||||
Stefan Petersen <spe@geda.seul.org>
|
||||
Jason Schonberg <schon@mips.com>
|
||||
Stuart Sutherland <stuart@sutherland.com>
|
||||
|
|
|
|||
63
elaborate.cc
63
elaborate.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: elaborate.cc,v 1.71 1999/08/18 04:00:02 steve Exp $"
|
||||
#ident "$Id: elaborate.cc,v 1.72 1999/08/23 16:48:39 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -463,7 +463,7 @@ void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const
|
|||
// elaboration causes the module to generate a netlist with
|
||||
// the ports represented by NetNet objects. I will find them
|
||||
// later.
|
||||
rmod->elaborate(des, my_name);
|
||||
rmod->elaborate(des, my_name, overrides_);
|
||||
|
||||
// Now connect the ports of the newly elaborated designs to
|
||||
// the expressions that are the instantiation parameters. Scan
|
||||
|
|
@ -643,29 +643,35 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path,
|
|||
|
||||
switch (op_) {
|
||||
case '^': // XOR
|
||||
assert(lsig->pin_count() == 1);
|
||||
assert(rsig->pin_count() == 1);
|
||||
gate = new NetLogic(des->local_symbol(path), 3, NetLogic::XOR);
|
||||
connect(gate->pin(1), lsig->pin(0));
|
||||
connect(gate->pin(2), rsig->pin(0));
|
||||
osig = new NetNet(des->local_symbol(path), NetNet::WIRE);
|
||||
assert(lsig->pin_count() == rsig->pin_count());
|
||||
osig = new NetNet(des->local_symbol(path), NetNet::WIRE,
|
||||
lsig->pin_count());
|
||||
osig->local_flag(true);
|
||||
connect(gate->pin(0), osig->pin(0));
|
||||
for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) {
|
||||
gate = new NetLogic(des->local_symbol(path), 3,
|
||||
NetLogic::XOR);
|
||||
connect(gate->pin(1), lsig->pin(idx));
|
||||
connect(gate->pin(2), rsig->pin(idx));
|
||||
connect(gate->pin(0), osig->pin(idx));
|
||||
des->add_node(gate);
|
||||
}
|
||||
des->add_signal(osig);
|
||||
des->add_node(gate);
|
||||
break;
|
||||
|
||||
case '&': // AND
|
||||
assert(lsig->pin_count() == 1);
|
||||
assert(rsig->pin_count() == 1);
|
||||
gate = new NetLogic(des->local_symbol(path), 3, NetLogic::AND);
|
||||
connect(gate->pin(1), lsig->pin(0));
|
||||
connect(gate->pin(2), rsig->pin(0));
|
||||
osig = new NetNet(des->local_symbol(path), NetNet::WIRE);
|
||||
assert(lsig->pin_count() == rsig->pin_count());
|
||||
osig = new NetNet(des->local_symbol(path), NetNet::WIRE,
|
||||
lsig->pin_count());
|
||||
osig->local_flag(true);
|
||||
connect(gate->pin(0), osig->pin(0));
|
||||
for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) {
|
||||
gate = new NetLogic(des->local_symbol(path), 3,
|
||||
NetLogic::AND);
|
||||
connect(gate->pin(1), lsig->pin(idx));
|
||||
connect(gate->pin(2), rsig->pin(idx));
|
||||
connect(gate->pin(0), osig->pin(idx));
|
||||
des->add_node(gate);
|
||||
}
|
||||
des->add_signal(osig);
|
||||
des->add_node(gate);
|
||||
break;
|
||||
|
||||
case '|': // Bitwise OR
|
||||
|
|
@ -1941,7 +1947,7 @@ NetProc* PWhile::elaborate(Design*des, const string&path) const
|
|||
return loop;
|
||||
}
|
||||
|
||||
bool Module::elaborate(Design*des, const string&path) const
|
||||
bool Module::elaborate(Design*des, const string&path, svector<PExpr*>*overrides_) const
|
||||
{
|
||||
bool result_flag = true;
|
||||
|
||||
|
|
@ -1955,6 +1961,19 @@ bool Module::elaborate(Design*des, const string&path) const
|
|||
des->set_parameter(pname, expr);
|
||||
}
|
||||
|
||||
// Override parameters
|
||||
// FIXME: need to check if too many overrides given
|
||||
// FIXME: need to release the replaced expression.
|
||||
|
||||
if (overrides_) {
|
||||
list<string>::const_iterator cur = param_names.begin();
|
||||
for (unsigned idx = 0 ; idx < overrides_->count(); idx += 1, cur++) {
|
||||
string pname = path + "." + (*cur);
|
||||
NetExpr*expr = (*overrides_)[idx]->elaborate_expr(des, path);
|
||||
des->set_parameter(pname, expr);
|
||||
}
|
||||
}
|
||||
|
||||
// Get all the explicitly declared wires of the module and
|
||||
// start the signals list with them.
|
||||
const list<PWire*>&wl = get_wires();
|
||||
|
|
@ -2037,7 +2056,7 @@ Design* elaborate(const map<string,Module*>&modules,
|
|||
|
||||
modlist = &modules;
|
||||
udplist = &primitives;
|
||||
bool rc = rmod->elaborate(des, root);
|
||||
bool rc = rmod->elaborate(des, root, (svector<PExpr*>*)0);
|
||||
modlist = 0;
|
||||
udplist = 0;
|
||||
|
||||
|
|
@ -2051,6 +2070,10 @@ Design* elaborate(const map<string,Module*>&modules,
|
|||
|
||||
/*
|
||||
* $Log: elaborate.cc,v $
|
||||
* Revision 1.72 1999/08/23 16:48:39 steve
|
||||
* Parameter overrides support from Peter Monta
|
||||
* AND and XOR support wide expressions.
|
||||
*
|
||||
* Revision 1.71 1999/08/18 04:00:02 steve
|
||||
* Fixup spelling and some error messages. <LRDoolittle@lbl.gov>
|
||||
*
|
||||
|
|
|
|||
8
parse.y
8
parse.y
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: parse.y,v 1.58 1999/08/03 04:48:51 steve Exp $"
|
||||
#ident "$Id: parse.y,v 1.59 1999/08/23 16:48:39 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "parse_misc.h"
|
||||
|
|
@ -990,12 +990,8 @@ module_item
|
|||
{ pform_makegates($1, $2, $3);
|
||||
}
|
||||
| IDENTIFIER delay_opt gate_instance_list ';'
|
||||
{ pform_make_modgates($1, $3);
|
||||
{ pform_make_modgates($1, $2, $3);
|
||||
delete $1;
|
||||
if ($2) {
|
||||
yyerror(@2, "Sorry, parameter override not supported.");
|
||||
delete $2;
|
||||
}
|
||||
}
|
||||
| K_assign delay_opt lavalue '=' expression ';'
|
||||
{ PGAssign*tmp = pform_make_pgassign($3, $5, $2);
|
||||
|
|
|
|||
23
pform.cc
23
pform.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: pform.cc,v 1.37 1999/08/03 04:14:49 steve Exp $"
|
||||
#ident "$Id: pform.cc,v 1.38 1999/08/23 16:48:39 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "compiler.h"
|
||||
|
|
@ -296,6 +296,7 @@ void pform_makegates(PGBuiltin::Type type,
|
|||
*/
|
||||
static void pform_make_modgate(const string&type,
|
||||
const string&name,
|
||||
svector<PExpr*>*overrides,
|
||||
svector<PExpr*>*wires,
|
||||
const string&fn, unsigned ln)
|
||||
{
|
||||
|
|
@ -306,7 +307,7 @@ static void pform_make_modgate(const string&type,
|
|||
return;
|
||||
}
|
||||
|
||||
PGate*cur = new PGModule(type, name, wires);
|
||||
PGate*cur = new PGModule(type, name, overrides, wires);
|
||||
cur->set_file(fn);
|
||||
cur->set_lineno(ln);
|
||||
pform_cur_module->add_gate(cur);
|
||||
|
|
@ -314,6 +315,7 @@ static void pform_make_modgate(const string&type,
|
|||
|
||||
static void pform_make_modgate(const string&type,
|
||||
const string&name,
|
||||
svector<PExpr*>*overrides,
|
||||
svector<portname_t*>*bind,
|
||||
const string&fn, unsigned ln)
|
||||
{
|
||||
|
|
@ -332,27 +334,29 @@ static void pform_make_modgate(const string&type,
|
|||
pins[idx].parm = curp->parm;
|
||||
}
|
||||
|
||||
PGate*cur = new PGModule(type, name, pins, npins);
|
||||
PGate*cur = new PGModule(type, name, overrides, pins, npins);
|
||||
cur->set_file(fn);
|
||||
cur->set_lineno(ln);
|
||||
pform_cur_module->add_gate(cur);
|
||||
}
|
||||
|
||||
void pform_make_modgates(const string&type, svector<lgate>*gates)
|
||||
void pform_make_modgates(const string&type,
|
||||
svector<PExpr*>*overrides,
|
||||
svector<lgate>*gates)
|
||||
{
|
||||
for (unsigned idx = 0 ; idx < gates->count() ; idx += 1) {
|
||||
lgate cur = (*gates)[idx];
|
||||
|
||||
if (cur.parms_by_name) {
|
||||
pform_make_modgate(type, cur.name, cur.parms_by_name,
|
||||
pform_make_modgate(type, cur.name, overrides, cur.parms_by_name,
|
||||
cur.file, cur.lineno);
|
||||
|
||||
} else if (cur.parms) {
|
||||
pform_make_modgate(type, cur.name, cur.parms, cur.file,
|
||||
pform_make_modgate(type, cur.name, overrides, cur.parms, cur.file,
|
||||
cur.lineno);
|
||||
} else {
|
||||
svector<PExpr*>*wires = new svector<PExpr*>(0);
|
||||
pform_make_modgate(type, cur.name, wires, cur.file,
|
||||
pform_make_modgate(type, cur.name, overrides, wires, cur.file,
|
||||
cur.lineno);
|
||||
}
|
||||
}
|
||||
|
|
@ -573,6 +577,7 @@ void pform_set_net_range(list<string>*names, const svector<PExpr*>*range)
|
|||
void pform_set_parameter(const string&name, PExpr*expr)
|
||||
{
|
||||
pform_cur_module->parameters[name] = expr;
|
||||
pform_cur_module->param_names.push_back(name);
|
||||
}
|
||||
|
||||
void pform_set_port_type(list<string>*names, NetNet::PortType pt)
|
||||
|
|
@ -655,6 +660,10 @@ int pform_parse(const char*path, map<string,Module*>&modules,
|
|||
|
||||
/*
|
||||
* $Log: pform.cc,v $
|
||||
* Revision 1.38 1999/08/23 16:48:39 steve
|
||||
* Parameter overrides support from Peter Monta
|
||||
* AND and XOR support wide expressions.
|
||||
*
|
||||
* Revision 1.37 1999/08/03 04:14:49 steve
|
||||
* Parse into pform arbitrarily complex module
|
||||
* port declarations.
|
||||
|
|
|
|||
10
pform.h
10
pform.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: pform.h,v 1.27 1999/08/03 04:14:49 steve Exp $"
|
||||
#ident "$Id: pform.h,v 1.28 1999/08/23 16:48:39 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "netlist.h"
|
||||
|
|
@ -141,7 +141,9 @@ extern void pform_makegates(PGBuiltin::Type type,
|
|||
svector<PExpr*>*delay,
|
||||
svector<lgate>*gates);
|
||||
|
||||
extern void pform_make_modgates(const string&type, svector<lgate>*gates);
|
||||
extern void pform_make_modgates(const string&type,
|
||||
svector<PExpr*>*overrides,
|
||||
svector<lgate>*gates);
|
||||
|
||||
/* Make a continuous assignment node, with optional bit- or part- select. */
|
||||
extern PGAssign* pform_make_pgassign(PExpr*lval, PExpr*rval,
|
||||
|
|
@ -167,6 +169,10 @@ extern void pform_dump(ostream&out, Module*mod);
|
|||
|
||||
/*
|
||||
* $Log: pform.h,v $
|
||||
* Revision 1.28 1999/08/23 16:48:39 steve
|
||||
* Parameter overrides support from Peter Monta
|
||||
* AND and XOR support wide expressions.
|
||||
*
|
||||
* Revision 1.27 1999/08/03 04:14:49 steve
|
||||
* Parse into pform arbitrarily complex module
|
||||
* port declarations.
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: pform_dump.cc,v 1.34 1999/08/03 04:49:13 steve Exp $"
|
||||
#ident "$Id: pform_dump.cc,v 1.35 1999/08/23 16:48:39 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -268,7 +268,16 @@ void PGBuiltin::dump(ostream&out) const
|
|||
|
||||
void PGModule::dump(ostream&out) const
|
||||
{
|
||||
out << " " << type_ << " " << get_name() << "(";
|
||||
out << " " << type_ << " ";
|
||||
if (overrides_) {
|
||||
out << "#(";
|
||||
out << *((*overrides_)[0]);
|
||||
for (unsigned idx = 1 ; idx < overrides_->count() ; idx += 1) {
|
||||
out << "," << *((*overrides_)[idx]);
|
||||
}
|
||||
out << ") ";
|
||||
}
|
||||
out << get_name() << "(";
|
||||
if (pins_) {
|
||||
out << "." << pins_[0].name << "(" << *pins_[0].parm << ")";
|
||||
for (unsigned idx = 1 ; idx < npins_ ; idx += 1) {
|
||||
|
|
@ -619,6 +628,10 @@ void PUdp::dump(ostream&out) const
|
|||
|
||||
/*
|
||||
* $Log: pform_dump.cc,v $
|
||||
* Revision 1.35 1999/08/23 16:48:39 steve
|
||||
* Parameter overrides support from Peter Monta
|
||||
* AND and XOR support wide expressions.
|
||||
*
|
||||
* Revision 1.34 1999/08/03 04:49:13 steve
|
||||
* Proper port type names.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue