Support elaborate_net for PEString objects.

This commit is contained in:
steve 2001-12-30 21:32:03 +00:00
parent fd5c0cfa28
commit 03aebd7525
4 changed files with 92 additions and 20 deletions

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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: PExpr.cc,v 1.28 2001/12/03 04:47:14 steve Exp $" #ident "$Id: PExpr.cc,v 1.29 2001/12/30 21:32:03 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -46,18 +46,6 @@ bool PExpr::is_constant(Module*) const
return false; return false;
} }
NetNet* PExpr::elaborate_net(Design*des, NetScope*scope, unsigned,
unsigned long,
unsigned long,
unsigned long,
Link::strength_t,
Link::strength_t) const
{
cerr << get_line() << ": error: Unable to elaborate `"
<< *this << "' as gates." << endl;
return 0;
}
NetNet* PExpr::elaborate_lnet(Design*des, NetScope*) const NetNet* PExpr::elaborate_lnet(Design*des, NetScope*) const
{ {
cerr << get_line() << ": error: expression not valid in assign l-value: " cerr << get_line() << ": error: expression not valid in assign l-value: "
@ -216,13 +204,14 @@ bool PENumber::is_constant(Module*) const
return true; return true;
} }
PEString::PEString(const string&s) PEString::PEString(char*s)
: text_(s) : text_(s)
{ {
} }
PEString::~PEString() PEString::~PEString()
{ {
delete[]text_;
} }
string PEString::value() const string PEString::value() const
@ -267,6 +256,9 @@ bool PEUnary::is_constant(Module*m) const
/* /*
* $Log: PExpr.cc,v $ * $Log: PExpr.cc,v $
* Revision 1.29 2001/12/30 21:32:03 steve
* Support elaborate_net for PEString objects.
*
* Revision 1.28 2001/12/03 04:47:14 steve * Revision 1.28 2001/12/03 04:47:14 steve
* Parser and pform use hierarchical names as hname_t * Parser and pform use hierarchical names as hname_t
* objects instead of encoded strings. * objects instead of encoded strings.

23
PExpr.h
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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: PExpr.h,v 1.53 2001/12/03 04:47:14 steve Exp $" #ident "$Id: PExpr.h,v 1.54 2001/12/30 21:32:03 steve Exp $"
#endif #endif
# include <string> # include <string>
@ -285,21 +285,35 @@ class PENumber : public PExpr {
verinum*const value_; verinum*const value_;
}; };
/*
* This represents a string constant in an expression.
*
* The s parameter to the PEString constructor is a C string that this
* class instance will take for its own. The caller should not delete
* the string, the destructor will do it.
*/
class PEString : public PExpr { class PEString : public PExpr {
public: public:
explicit PEString(const string&s); explicit PEString(char*s);
~PEString(); ~PEString();
string value() const; string value() const;
virtual void dump(ostream&) const; virtual void dump(ostream&) const;
virtual NetNet* elaborate_net(Design*des, NetScope*scope,
unsigned width,
unsigned long rise,
unsigned long fall,
unsigned long decay,
Link::strength_t drive0,
Link::strength_t drive1) const;
virtual NetEConst*elaborate_expr(Design*des, NetScope*) const; virtual NetEConst*elaborate_expr(Design*des, NetScope*) const;
virtual NetEConst*elaborate_pexpr(Design*des, NetScope*sc) const; virtual NetEConst*elaborate_pexpr(Design*des, NetScope*sc) const;
virtual bool is_constant(Module*) const; virtual bool is_constant(Module*) const;
private: private:
const string text_; char*text_;
}; };
class PEUnary : public PExpr { class PEUnary : public PExpr {
@ -449,6 +463,9 @@ class PECallFunction : public PExpr {
/* /*
* $Log: PExpr.h,v $ * $Log: PExpr.h,v $
* Revision 1.54 2001/12/30 21:32:03 steve
* Support elaborate_net for PEString objects.
*
* Revision 1.53 2001/12/03 04:47:14 steve * Revision 1.53 2001/12/03 04:47:14 steve
* Parser and pform use hierarchical names as hname_t * Parser and pform use hierarchical names as hname_t
* objects instead of encoded strings. * objects instead of encoded strings.

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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: elab_net.cc,v 1.82 2001/12/03 04:47:14 steve Exp $" #ident "$Id: elab_net.cc,v 1.83 2001/12/30 21:32:03 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -29,6 +29,18 @@
# include <iostream> # include <iostream>
NetNet* PExpr::elaborate_net(Design*des, NetScope*scope, unsigned,
unsigned long,
unsigned long,
unsigned long,
Link::strength_t,
Link::strength_t) const
{
cerr << get_line() << ": error: Unable to elaborate `"
<< *this << "' as gates." << endl;
return 0;
}
/* /*
* Elaborating binary operations generally involves elaborating the * Elaborating binary operations generally involves elaborating the
* left and right expressions, then making an output wire and * left and right expressions, then making an output wire and
@ -1539,6 +1551,55 @@ NetNet* PENumber::elaborate_net(Design*des, NetScope*scope,
return net; return net;
} }
/*
* A string is a NetEConst node that is made of the ASCII bits of the
* string instead of the bits of a number. In fact, a string is just
* another numeric notation.
*/
NetNet* PEString::elaborate_net(Design*des, NetScope*scope,
unsigned lwidth,
unsigned long rise,
unsigned long fall,
unsigned long decay,
Link::strength_t drive0,
Link::strength_t drive1) const
{
unsigned strbits = strlen(text_) * 8;
NetNet*net;
/* If we are constrained by a l-value size, then just make a
number constant with the correct size and set as many bits
in that constant as make sense. Pad excess with zeros. */
if (lwidth > 0) {
net = new NetNet(scope, scope->local_hsymbol(),
NetNet::IMPLICIT, lwidth);
} else {
net = new NetNet(scope, scope->local_hsymbol(),
NetNet::IMPLICIT, strbits);
}
net->local_flag(true);
/* Make a verinum that is filled with the 0 pad. */
verinum num(verinum::V0, net->pin_count());
unsigned idx;
for (idx = 0 ; idx < num.len() && idx < strbits; idx += 1) {
char byte = text_[strbits/8 - 1 - idx/8];
char mask = 1<<(idx%8);
num.set(idx, (byte & mask)? verinum::V1 : verinum::V0);
}
NetConst*tmp = new NetConst(scope, scope->local_hsymbol(), num);
for (idx = 0 ; idx < net->pin_count() ; idx += 1) {
tmp->pin(idx).drive0(drive0);
tmp->pin(idx).drive1(drive1);
connect(net->pin(idx), tmp->pin(idx));
}
des->add_node(tmp);
return net;
}
/* /*
* Elaborate the ternary operator in a netlist by creating a LPM_MUX * Elaborate the ternary operator in a netlist by creating a LPM_MUX
@ -1880,6 +1941,9 @@ NetNet* PEUnary::elaborate_net(Design*des, NetScope*scope,
/* /*
* $Log: elab_net.cc,v $ * $Log: elab_net.cc,v $
* Revision 1.83 2001/12/30 21:32:03 steve
* Support elaborate_net for PEString objects.
*
* Revision 1.82 2001/12/03 04:47:14 steve * Revision 1.82 2001/12/03 04:47:14 steve
* Parser and pform use hierarchical names as hname_t * Parser and pform use hierarchical names as hname_t
* objects instead of encoded strings. * objects instead of encoded strings.

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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: parse.y,v 1.141 2001/12/14 02:05:13 steve Exp $" #ident "$Id: parse.y,v 1.142 2001/12/30 21:32:03 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -819,7 +819,6 @@ expr_primary
tmp->set_file(@1.text); tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
$$ = tmp; $$ = tmp;
delete $1;
} }
| identifier | identifier
{ PEIdent*tmp = new PEIdent(*$1); { PEIdent*tmp = new PEIdent(*$1);