More identifier lists use perm_strings.

This commit is contained in:
steve 2004-05-25 19:21:06 +00:00
parent 55ba131997
commit e7fa56981a
6 changed files with 105 additions and 89 deletions

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: Module.h,v 1.35 2004/02/20 18:53:33 steve Exp $"
#ident "$Id: Module.h,v 1.36 2004/05/25 19:21:06 steve Exp $"
#endif
# include <list>
@ -84,7 +84,7 @@ class Module : public LineInfo {
/* specparams are simpler then other params, in that they have
no type information. They are merely constant
expressions. */
map<string,PExpr*>specparams;
map<perm_string,PExpr*>specparams;
/* The module also has defparam assignments which don't create
new parameters within the module, but may be used to set
@ -105,7 +105,7 @@ class Module : public LineInfo {
svector<port_t*> ports;
/* Keep a table of named events declared in the module. */
map<string,PEvent*>events;
map<perm_string,PEvent*>events;
/* Keep a table of datum variables declared in the module. */
map<hname_t,PData*>datum;
@ -166,6 +166,9 @@ class Module : public LineInfo {
/*
* $Log: Module.h,v $
* Revision 1.36 2004/05/25 19:21:06 steve
* More identifier lists use perm_strings.
*
* Revision 1.35 2004/02/20 18:53:33 steve
* Addtrbute keys are perm_strings.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: elab_scope.cc,v 1.30 2004/02/20 06:22:56 steve Exp $"
#ident "$Id: elab_scope.cc,v 1.31 2004/05/25 19:21:06 steve Exp $"
#endif
# include "config.h"
@ -226,7 +226,7 @@ bool Module::elaborate_scope(Design*des, NetScope*scope) const
// elaboration, so do it now. This allows for normal
// elaboration to reference these events.
for (map<string,PEvent*>::const_iterator et = events.begin()
for (map<perm_string,PEvent*>::const_iterator et = events.begin()
; et != events.end() ; et ++ ) {
(*et).second->elaborate_scope(des, scope);
@ -549,6 +549,9 @@ void PWhile::elaborate_scope(Design*des, NetScope*scope) const
/*
* $Log: elab_scope.cc,v $
* Revision 1.31 2004/05/25 19:21:06 steve
* More identifier lists use perm_strings.
*
* Revision 1.30 2004/02/20 06:22:56 steve
* parameter keys are per_strings.
*

49
parse.y
View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: parse.y,v 1.194 2004/05/25 03:42:44 steve Exp $"
#ident "$Id: parse.y,v 1.195 2004/05/25 19:21:06 steve Exp $"
#endif
# include "config.h"
@ -77,7 +77,6 @@ const static struct str_pair_t str_strength = { PGate::STRONG, PGate::STRONG };
/* text items are C strings allocated by the lexor using
strdup. They can be put into lists with the texts type. */
char*text;
list<char*>*texts;
list<perm_string>*perm_strings;
hname_t*hier;
@ -169,7 +168,7 @@ const static struct str_pair_t str_strength = { PGate::STRONG, PGate::STRONG };
%type <hier> identifier
%type <text> register_variable
%type <texts> register_variable_list list_of_identifiers
%type <perm_strings> register_variable_list list_of_identifiers
%type <net_decl_assign> net_decl_assign net_decl_assigns
@ -215,7 +214,7 @@ const static struct str_pair_t str_strength = { PGate::STRONG, PGate::STRONG };
%type <range_delay> range_delay
%type <letter> spec_polarity
%type <texts> specify_path_identifiers
%type <perm_strings> specify_path_identifiers
%token K_TAND
%right '?' ':'
@ -1171,14 +1170,16 @@ identifier
non-hierarchical names separated by ',' characters. */
list_of_identifiers
: IDENTIFIER
{ list<char*>*tmp = new list<char*>;
tmp->push_back($1);
{ list<perm_string>*tmp = new list<perm_string>;
tmp->push_back(lex_strings.make($1));
$$ = tmp;
delete[]$1;
}
| list_of_identifiers ',' IDENTIFIER
{ list<char*>*tmp = $1;
tmp->push_back($3);
{ list<perm_string>*tmp = $1;
tmp->push_back(lex_strings.make($3));
$$ = tmp;
delete[]$3;
}
;
@ -2197,14 +2198,16 @@ register_variable
register_variable_list
: register_variable
{ list<char*>*tmp = new list<char*>;
tmp->push_back($1);
{ list<perm_string>*tmp = new list<perm_string>;
tmp->push_back(lex_strings.make($1));
$$ = tmp;
delete[]$1;
}
| register_variable_list ',' register_variable
{ list<char*>*tmp = $1;
tmp->push_back($3);
{ list<perm_string>*tmp = $1;
tmp->push_back(lex_strings.make($3));
$$ = tmp;
delete[]$3;
}
;
@ -2314,24 +2317,28 @@ specify_simple_path
specify_path_identifiers
: IDENTIFIER
{ list<char*>*tmp = new list<char*>;
tmp->push_back($1);
{ list<perm_string>*tmp = new list<perm_string>;
tmp->push_back(lex_strings.make($1));
$$ = tmp;
delete[]$1;
}
| IDENTIFIER '[' expr_primary ']'
{ list<char*>*tmp = new list<char*>;
tmp->push_back($1);
{ list<perm_string>*tmp = new list<perm_string>;
tmp->push_back(lex_strings.make($1));
$$ = tmp;
delete[]$1;
}
| specify_path_identifiers ',' IDENTIFIER
{ list<char*>*tmp = $1;
tmp->push_back($3);
{ list<perm_string>*tmp = $1;
tmp->push_back(lex_strings.make($3));
$$ = tmp;
delete[]$3;
}
| specify_path_identifiers ',' IDENTIFIER '[' expr_primary ']'
{ list<char*>*tmp = $1;
tmp->push_back($3);
{ list<perm_string>*tmp = $1;
tmp->push_back(lex_strings.make($3));
$$ = tmp;
delete[]$3;
}
;
@ -2344,7 +2351,7 @@ specparam
delete tmp;
tmp = 0;
} else {
pform_set_specparam($1, tmp);
pform_set_specparam(lex_strings.make($1), tmp);
}
delete $1;
}

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: pform.cc,v 1.124 2004/03/08 00:10:30 steve Exp $"
#ident "$Id: pform.cc,v 1.125 2004/05/25 19:21:07 steve Exp $"
#endif
# include "config.h"
@ -668,7 +668,7 @@ void pform_make_udp(perm_string name, bool synchronous_flag,
* only called by the parser within the scope of the net declaration,
* and the name that I receive only has the tail component.
*/
static void pform_set_net_range(const char*name,
static void pform_set_net_range(const char* name,
const svector<PExpr*>*range,
bool signed_flag)
{
@ -693,18 +693,17 @@ static void pform_set_net_range(const char*name,
cur->set_signed(signed_flag);
}
void pform_set_net_range(list<char*>*names,
void pform_set_net_range(list<perm_string>*names,
svector<PExpr*>*range,
bool signed_flag)
{
assert((range == 0) || (range->count() == 2));
for (list<char*>::iterator cur = names->begin()
for (list<perm_string>::iterator cur = names->begin()
; cur != names->end()
; cur ++ ) {
char*txt = *cur;
perm_string txt = *cur;
pform_set_net_range(txt, range, signed_flag);
free(txt);
}
delete names;
@ -716,27 +715,26 @@ void pform_set_net_range(list<char*>*names,
* This is invoked to make a named event. This is the declaration of
* the event, and not necessarily the use of it.
*/
static void pform_make_event(const char*name, const char*fn, unsigned ln)
static void pform_make_event(perm_string name, const char*fn, unsigned ln)
{
PEvent*event = new PEvent(lex_strings.make(name));
PEvent*event = new PEvent(name);
event->set_file(fn);
event->set_lineno(ln);
pform_cur_module->events[name] = event;
}
void pform_make_events(list<char*>*names, const char*fn, unsigned ln)
void pform_make_events(list<perm_string>*names, const char*fn, unsigned ln)
{
list<char*>::iterator cur;
list<perm_string>::iterator cur;
for (cur = names->begin() ; cur != names->end() ; cur++) {
char*txt = *cur;
perm_string txt = *cur;
pform_make_event(txt, fn, ln);
free(txt);
}
delete names;
}
static void pform_make_datum(const char*name, const char*fn, unsigned ln)
static void pform_make_datum(perm_string name, const char*fn, unsigned ln)
{
hname_t hname = hier_name(name);
PData*datum = new PData(hname);
@ -745,13 +743,12 @@ static void pform_make_datum(const char*name, const char*fn, unsigned ln)
pform_cur_module->datum[hname] = datum;
}
void pform_make_reals(list<char*>*names, const char*fn, unsigned ln)
void pform_make_reals(list<perm_string>*names, const char*fn, unsigned ln)
{
list<char*>::iterator cur;
list<perm_string>::iterator cur;
for (cur = names->begin() ; cur != names->end() ; cur++) {
char*txt = *cur;
perm_string txt = *cur;
pform_make_datum(txt, fn, ln);
free(txt);
}
delete names;
@ -1131,18 +1128,17 @@ void pform_makewire(const vlltype&li, const char*nm,
void pform_makewire(const vlltype&li,
svector<PExpr*>*range,
bool signed_flag,
list<char*>*names,
list<perm_string>*names,
NetNet::Type type,
NetNet::PortType pt,
svector<named_pexpr_t*>*attr)
{
for (list<char*>::iterator cur = names->begin()
for (list<perm_string>::iterator cur = names->begin()
; cur != names->end()
; cur ++ ) {
char*txt = *cur;
perm_string txt = *cur;
pform_makewire(li, txt, type, pt, attr);
pform_set_net_range(txt, range, signed_flag);
free(txt);
}
delete names;
@ -1182,7 +1178,7 @@ void pform_makewire(const vlltype&li,
}
}
void pform_set_port_type(const char*nm, NetNet::PortType pt,
void pform_set_port_type(perm_string nm, NetNet::PortType pt,
const char*file, unsigned lineno)
{
hname_t name = hier_name(nm);
@ -1259,16 +1255,16 @@ void pform_set_port_type(const char*nm, NetNet::PortType pt,
svector<PWire*>*pform_make_task_ports(NetNet::PortType pt,
bool signed_flag,
svector<PExpr*>*range,
list<char*>*names,
list<perm_string>*names,
const char* file,
unsigned lineno)
{
assert(names);
svector<PWire*>*res = new svector<PWire*>(0);
for (list<char*>::iterator cur = names->begin()
for (list<perm_string>::iterator cur = names->begin()
; cur != names->end() ; cur ++ ) {
char*txt = *cur;
perm_string txt = *cur;
hname_t name = hier_name(txt);
/* Look for a preexisting wire. If it exists, set the
@ -1291,7 +1287,6 @@ svector<PWire*>*pform_make_task_ports(NetNet::PortType pt,
svector<PWire*>*tmp = new svector<PWire*>(*res, curw);
free(txt);
delete res;
res = tmp;
}
@ -1424,7 +1419,7 @@ void pform_set_localparam(perm_string name, PExpr*expr)
pform_cur_module->localparams[name].signed_flag = false;
}
void pform_set_specparam(const string&name, PExpr*expr)
void pform_set_specparam(perm_string name, PExpr*expr)
{
assert(expr);
pform_cur_module->specparams[name] = expr;
@ -1439,27 +1434,26 @@ void pform_set_defparam(const hname_t&name, PExpr*expr)
/*
* XXXX Not implemented yet.
*/
extern void pform_make_specify_path(list<char*>*src, char pol,
bool full_flag, list<char*>*dst)
extern void pform_make_specify_path(list<perm_string>*src, char pol,
bool full_flag, list<perm_string>*dst)
{
delete src;
delete dst;
}
void pform_set_port_type(const struct vlltype&li,
list<char*>*names,
list<perm_string>*names,
svector<PExpr*>*range,
bool signed_flag,
NetNet::PortType pt)
{
for (list<char*>::iterator cur = names->begin()
for (list<perm_string>::iterator cur = names->begin()
; cur != names->end()
; cur ++ ) {
char*txt = *cur;
perm_string txt = *cur;
pform_set_port_type(txt, pt, li.text, li.first_line);
if (range)
pform_set_net_range(txt, range, signed_flag);
free(txt);
}
delete names;
@ -1487,14 +1481,13 @@ static void pform_set_reg_integer(const char*nm)
cur->set_signed(true);
}
void pform_set_reg_integer(list<char*>*names)
void pform_set_reg_integer(list<perm_string>*names)
{
for (list<char*>::iterator cur = names->begin()
for (list<perm_string>::iterator cur = names->begin()
; cur != names->end()
; cur ++ ) {
char*txt = *cur;
perm_string txt = *cur;
pform_set_reg_integer(txt);
free(txt);
}
delete names;
}
@ -1516,31 +1509,31 @@ static void pform_set_reg_time(const char*nm)
new PENumber(new verinum(0UL, INTEGER_WIDTH)));
}
void pform_set_reg_time(list<char*>*names)
void pform_set_reg_time(list<perm_string>*names)
{
for (list<char*>::iterator cur = names->begin()
for (list<perm_string>::iterator cur = names->begin()
; cur != names->end()
; cur ++ ) {
char*txt = *cur;
perm_string txt = *cur;
pform_set_reg_time(txt);
free(txt);
}
delete names;
}
svector<PWire*>* pform_make_udp_input_ports(list<char*>*names)
svector<PWire*>* pform_make_udp_input_ports(list<perm_string>*names)
{
svector<PWire*>*out = new svector<PWire*>(names->size());
unsigned idx = 0;
for (list<char*>::iterator cur = names->begin()
for (list<perm_string>::iterator cur = names->begin()
; cur != names->end()
; cur ++ ) {
char*txt = *cur;
PWire*pp = new PWire(txt, NetNet::IMPLICIT, NetNet::PINPUT);
perm_string txt = *cur;
PWire*pp = new PWire(hname_t(txt),
NetNet::IMPLICIT,
NetNet::PINPUT);
(*out)[idx] = pp;
idx += 1;
free(txt);
}
delete names;
@ -1605,6 +1598,9 @@ int pform_parse(const char*path, FILE*file)
/*
* $Log: pform.cc,v $
* Revision 1.125 2004/05/25 19:21:07 steve
* More identifier lists use perm_strings.
*
* Revision 1.124 2004/03/08 00:10:30 steve
* Verilog2001 new style port declartions for primitives.
*

32
pform.h
View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: pform.h,v 1.77 2004/03/08 00:10:30 steve Exp $"
#ident "$Id: pform.h,v 1.78 2004/05/25 19:21:07 steve Exp $"
#endif
# include "netlist.h"
@ -172,7 +172,7 @@ extern void pform_makewire(const struct vlltype&li, const char*name,
extern void pform_makewire(const struct vlltype&li,
svector<PExpr*>*range,
bool signed_flag,
list<char*>*names,
list<perm_string>*names,
NetNet::Type type,
NetNet::PortType,
svector<named_pexpr_t*>*attr);
@ -190,17 +190,18 @@ extern void pform_make_reginit(const struct vlltype&li,
i.e. input, output or inout. If the wire does not exist, create
it. The second form takes a single name. */
extern void pform_set_port_type(const struct vlltype&li,
list<char*>*names,
list<perm_string>*names,
svector<PExpr*>*range,
bool signed_flag,
NetNet::PortType);
extern void pform_set_port_type(const char*nm, NetNet::PortType pt,
extern void pform_set_port_type(perm_string nm, NetNet::PortType pt,
const char*file, unsigned lineno);
extern void pform_set_net_range(list<char*>*names, svector<PExpr*>*, bool);
extern void pform_set_net_range(list<perm_string>*names,
svector<PExpr*>*, bool);
extern void pform_set_reg_idx(const char*name, PExpr*l, PExpr*r);
extern void pform_set_reg_integer(list<char*>*names);
extern void pform_set_reg_time(list<char*>*names);
extern void pform_set_reg_integer(list<perm_string>*names);
extern void pform_set_reg_time(list<perm_string>*names);
extern void pform_set_task(perm_string name, PTask*);
extern void pform_set_function(const char*, NetNet::Type,
svector<PExpr*>*, PFunction*);
@ -224,9 +225,9 @@ extern void pform_set_defparam(const hname_t&name, PExpr*expr);
/*
* Functions related to specify blocks.
*/
extern void pform_set_specparam(const string&name, PExpr*expr);
extern void pform_make_specify_path(list<char*>*src, char pol,
bool full_flag, list<char*>*dst);
extern void pform_set_specparam(perm_string name, PExpr*expr);
extern void pform_make_specify_path(list<perm_string>*src, char pol,
bool full_flag, list<perm_string>*dst);
/*
* pform_make_behavior creates processes that are declared with always
@ -235,16 +236,16 @@ extern void pform_make_specify_path(list<char*>*src, char pol,
extern PProcess* pform_make_behavior(PProcess::Type, Statement*,
svector<named_pexpr_t*>*attr);
extern svector<PWire*>* pform_make_udp_input_ports(list<char*>*);
extern svector<PWire*>* pform_make_udp_input_ports(list<perm_string>*);
extern bool pform_expression_is_constant(const PExpr*);
extern void pform_make_events(list<char*>*names,
extern void pform_make_events(list<perm_string>*names,
const char*file, unsigned lineno);
/*
* Make real datum objects.
*/
extern void pform_make_reals(list<char*>*names,
extern void pform_make_reals(list<perm_string>*names,
const char*file, unsigned lineno);
/*
@ -275,7 +276,7 @@ extern void pform_make_pgassign_list(svector<PExpr*>*alist,
extern svector<PWire*>*pform_make_task_ports(NetNet::PortType pt,
bool signed_flag,
svector<PExpr*>*range,
list<char*>*names,
list<perm_string>*names,
const char* file,
unsigned lineno);
@ -290,6 +291,9 @@ extern void pform_dump(ostream&out, Module*mod);
/*
* $Log: pform.h,v $
* Revision 1.78 2004/05/25 19:21:07 steve
* More identifier lists use perm_strings.
*
* Revision 1.77 2004/03/08 00:10:30 steve
* Verilog2001 new style port declartions for primitives.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: pform_dump.cc,v 1.85 2004/02/20 18:53:35 steve Exp $"
#ident "$Id: pform_dump.cc,v 1.86 2004/05/25 19:21:07 steve Exp $"
#endif
# include "config.h"
@ -756,7 +756,7 @@ void Module::dump(ostream&out) const
out << "/* ERROR */;" << endl;
}
typedef map<string,PExpr*>::const_iterator specparm_iter_t;
typedef map<perm_string,PExpr*>::const_iterator specparm_iter_t;
for (specparm_iter_t cur = specparams.begin()
; cur != specparams.end() ; cur ++) {
out << " specparam " << (*cur).first << " = "
@ -772,7 +772,7 @@ void Module::dump(ostream&out) const
out << "/* ERROR */;" << endl;
}
for (map<string,PEvent*>::const_iterator cur = events.begin()
for (map<perm_string,PEvent*>::const_iterator cur = events.begin()
; cur != events.end() ; cur ++ ) {
PEvent*ev = (*cur).second;
out << " event " << ev->name() << "; // "
@ -881,6 +881,9 @@ void PUdp::dump(ostream&out) const
/*
* $Log: pform_dump.cc,v $
* Revision 1.86 2004/05/25 19:21:07 steve
* More identifier lists use perm_strings.
*
* Revision 1.85 2004/02/20 18:53:35 steve
* Addtrbute keys are perm_strings.
*