Handle expression widths for EEE and NEE operators,

add named blocks and scope handling,
 add registers declared in named blocks.
This commit is contained in:
steve 1999-06-24 04:24:18 +00:00
parent 33d4133217
commit 11b2b1740a
9 changed files with 234 additions and 84 deletions

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: Statement.cc,v 1.10 1999/06/19 21:06:16 steve Exp $"
#ident "$Id: Statement.cc,v 1.11 1999/06/24 04:24:18 steve Exp $"
#endif
# include "Statement.h"
@ -56,24 +56,25 @@ PAssignNB::~PAssignNB()
{
}
PBlock::PBlock(BL_TYPE t, const list<Statement*>&st)
PBlock::PBlock(const string&n, BL_TYPE t, const svector<Statement*>&st)
: name_(n), bl_type_(t), list_(st)
{
}
PBlock::PBlock(BL_TYPE t, const svector<Statement*>&st)
: bl_type_(t), list_(st)
{
}
PBlock::PBlock(BL_TYPE t)
: bl_type_(t)
{
nlist_ = st.size();
list_ = new Statement*[nlist_];
list<Statement*>::const_iterator s = st.begin();
for (unsigned idx = 0 ; s != st.end() ; s ++, idx += 1 ) {
list_[idx] = *s;
}
}
PBlock::~PBlock()
{
for (unsigned idx = 0 ; idx < nlist_ ; idx += 1)
for (unsigned idx = 0 ; idx < list_.count() ; idx += 1)
delete list_[idx];
delete[]list_;
}
PCallTask::PCallTask(const string&n, const svector<PExpr*>&p)
@ -136,6 +137,11 @@ PWhile::~PWhile()
/*
* $Log: Statement.cc,v $
* Revision 1.11 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.10 1999/06/19 21:06:16 steve
* Elaborate and supprort to vvm the forever
* and repeat statements.

View File

@ -19,11 +19,10 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: Statement.h,v 1.12 1999/06/19 21:06:16 steve Exp $"
#ident "$Id: Statement.h,v 1.13 1999/06/24 04:24:18 steve Exp $"
#endif
# include <string>
# include <list>
# include "svector.h"
# include "PExpr.h"
# include "LineInfo.h"
@ -132,21 +131,23 @@ class PBlock : public Statement {
public:
enum BL_TYPE { BL_SEQ, BL_PAR };
explicit PBlock(BL_TYPE t, const list<Statement*>&st);
explicit PBlock(const string&n, BL_TYPE t, const svector<Statement*>&st);
explicit PBlock(BL_TYPE t, const svector<Statement*>&st);
explicit PBlock(BL_TYPE t);
~PBlock();
BL_TYPE bl_type() const { return bl_type_; }
unsigned size() const { return nlist_; }
const Statement*stat(unsigned idx) const { return list_[idx]; }
//unsigned size() const { return list_.count(); }
//const Statement*stat(unsigned idx) const { return list_[idx]; }
virtual void dump(ostream&out, unsigned ind) const;
virtual NetProc* elaborate(Design*des, const string&path) const;
private:
string name_;
const BL_TYPE bl_type_;
unsigned nlist_;
Statement**list_;
svector<Statement*>list_;
};
class PCallTask : public Statement {
@ -326,6 +327,11 @@ class PWhile : public Statement {
/*
* $Log: Statement.h,v $
* Revision 1.13 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.12 1999/06/19 21:06:16 steve
* Elaborate and supprort to vvm the forever
* and repeat statements.

View File

@ -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.47 1999/06/19 21:06:16 steve Exp $"
#ident "$Id: elaborate.cc,v 1.48 1999/06/24 04:24:18 steve Exp $"
#endif
/*
@ -450,8 +450,7 @@ void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const
}
assert(sig);
NetNet*prt = des->find_signal(my_name + "." +
rmod->ports[idx]->name());
NetNet*prt = des->find_signal(my_name, rmod->ports[idx]->name());
assert(prt);
// Check that the parts have matching pin counts. If
@ -739,7 +738,7 @@ NetNet* PEConcat::elaborate_net(Design*des, const string&path) const
NetNet* PEIdent::elaborate_net(Design*des, const string&path) const
{
NetNet*sig = des->find_signal(path+"."+text_);
NetNet*sig = des->find_signal(path, text_);
if (sig == 0) {
cerr << get_line() << ": Unable to find signal ``" <<
text_ << "''" << endl;
@ -938,7 +937,7 @@ NetExpr*PEIdent::elaborate_expr(Design*des, const string&path) const
// If the identifier names a signal (a register or wire)
// then create a NetESignal node to handle it.
if (NetNet*net = des->find_signal(name)) {
if (NetNet*net = des->find_signal(path, text_)) {
NetESignal*node = des->get_esignal(net);
assert(idx_ == 0);
if (lsb_) {
@ -1034,11 +1033,11 @@ NetNet* PAssign_::elaborate_lval(Design*des, const string&path,
/* Get the signal referenced by the identifier, and make sure
it is a register. */
NetNet*reg = des->find_signal(path+"."+id->name());
NetNet*reg = des->find_signal(path, id->name());
if (reg == 0) {
cerr << get_line() << ": Could not match signal: " <<
id->name() << endl;
cerr << get_line() << ": Could not match signal ``" <<
id->name() << "'' in ``" << path << "''" << endl;
return 0;
}
assert(reg);
@ -1212,15 +1211,17 @@ NetProc* PBlock::elaborate(Design*des, const string&path) const
NetBlock*cur = new NetBlock(NetBlock::SEQU);
bool fail_flag = false;
string npath = name_.length()? (path+"."+name_) : path;
// Handle the special case that the block contains only one
// statement. There is no need to keep the block node.
if (size() == 1) {
NetProc*tmp = stat(0)->elaborate(des, path);
if (list_.count() == 1) {
NetProc*tmp = list_[0]->elaborate(des, npath);
return tmp;
}
for (unsigned idx = 0 ; idx < size() ; idx += 1) {
NetProc*tmp = stat(idx)->elaborate(des, path);
for (unsigned idx = 0 ; idx < list_.count() ; idx += 1) {
NetProc*tmp = list_[idx]->elaborate(des, npath);
if (tmp == 0) {
fail_flag = true;
continue;
@ -1328,7 +1329,15 @@ NetProc* PCondit::elaborate(Design*des, const string&path) const
else
return new NetBlock(NetBlock::SEQU);
}
if (! expr->set_width(1)) {
cerr << get_line() << ": Unable to set expression width to 1."
<< endl;
des->errors += 1;
delete expr;
return 0;
}
// Well, I actually need to generate code to handle the
// conditional, so elaborate.
NetProc*i = if_->elaborate(des, path);
@ -1447,7 +1456,7 @@ NetProc* PForStatement::elaborate(Design*des, const string&path) const
assert(id2);
NetBlock*top = new NetBlock(NetBlock::SEQU);
NetNet*sig = des->find_signal(path+"."+id1->name());
NetNet*sig = des->find_signal(path, id1->name());
if (sig == 0) {
cerr << id1->get_line() << ": register ``" << id1->name()
<< "'' unknown in this context." << endl;
@ -1466,7 +1475,7 @@ NetProc* PForStatement::elaborate(Design*des, const string&path) const
body->append(statement_->elaborate(des, path));
sig = des->find_signal(path+"."+id2->name());
sig = des->find_signal(path, id2->name());
assert(sig);
NetAssign*step = new NetAssign("@for-assign", des, sig->pin_count(),
expr2_->elaborate_expr(des, path));
@ -1629,6 +1638,11 @@ Design* elaborate(const map<string,Module*>&modules,
/*
* $Log: elaborate.cc,v $
* Revision 1.48 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.47 1999/06/19 21:06:16 steve
* Elaborate and supprort to vvm the forever
* and repeat statements.

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: netlist.cc,v 1.38 1999/06/19 21:06:16 steve Exp $"
#ident "$Id: netlist.cc,v 1.39 1999/06/24 04:24:18 steve Exp $"
#endif
# include <cassert>
@ -425,6 +425,11 @@ void NetCase::set_case(unsigned idx, NetExpr*e, NetProc*p)
items_[idx].guard->set_width(expr_->expr_width());
}
NetCondit::NetCondit(NetExpr*ex, NetProc*i, NetProc*e)
: expr_(ex), if_(i), else_(e)
{
}
NetTask::~NetTask()
{
for (unsigned idx = 0 ; idx < nparms_ ; idx += 1)
@ -468,8 +473,10 @@ bool NetEBinary::set_width(unsigned w)
/* Comparison operators allow the subexpressions to have
their own natural width. However, I do need to make
sure that the subexpressions have the same width. */
case 'e': /* == */
case 'n': /* != */
case 'E': /* === */
case 'e': /* == */
case 'N': /* !== */
case 'n': /* != */
case '<': /* < */
case '>': /* > */
assert(w == 1);
@ -1091,18 +1098,30 @@ void Design::del_signal(NetNet*net)
net->design_ = 0;
}
NetNet* Design::find_signal(const string&name)
/*
* This method looks for a string given a current context as a
* starting point.
*/
NetNet* Design::find_signal(const string&path, const string&name)
{
if (signals_ == 0)
return 0;
NetNet*cur = signals_;
do {
if (cur->name() == name)
return cur;
string root = path;
while (root.size() > 0) {
cur = cur->sig_prev_;
} while (cur != signals_);
string fulname = root + "." + name;
NetNet*cur = signals_;
do {
if (cur->name() == fulname)
return cur;
cur = cur->sig_prev_;
} while (cur != signals_);
unsigned pos = root.rfind('.');
root = root.substr(0, pos);
}
return 0;
}
@ -1228,6 +1247,11 @@ NetNet* Design::find_signal(bool (*func)(const NetNet*))
/*
* $Log: netlist.cc,v $
* Revision 1.39 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.38 1999/06/19 21:06:16 steve
* Elaborate and supprort to vvm the forever
* and repeat statements.

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: netlist.h,v 1.41 1999/06/19 21:06:16 steve Exp $"
#ident "$Id: netlist.h,v 1.42 1999/06/24 04:24:18 steve Exp $"
#endif
/*
@ -712,8 +712,7 @@ class NetCase : public NetProc {
class NetCondit : public NetProc {
public:
NetCondit(NetExpr*ex, NetProc*i, NetProc*e)
: expr_(ex), if_(i), else_(e) { }
explicit NetCondit(NetExpr*ex, NetProc*i, NetProc*e);
const NetExpr*expr() const { return expr_; }
void emit_recurse_if(ostream&, struct target_t*) const;
@ -1188,7 +1187,7 @@ class Design {
// SIGNALS
void add_signal(NetNet*);
void del_signal(NetNet*);
NetNet*find_signal(const string&name);
NetNet*find_signal(const string&path, const string&name);
// Memories
void add_memory(NetMemory*);
@ -1291,6 +1290,11 @@ extern ostream& operator << (ostream&, NetNet::Type);
/*
* $Log: netlist.h,v $
* Revision 1.42 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.41 1999/06/19 21:06:16 steve
* Elaborate and supprort to vvm the forever
* and repeat statements.

81
parse.y
View File

@ -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.46 1999/06/19 21:06:16 steve Exp $"
#ident "$Id: parse.y,v 1.47 1999/06/24 04:24:18 steve Exp $"
#endif
# include "parse_misc.h"
@ -57,7 +57,7 @@ extern void lex_end_table();
PEventStatement*event_statement;
Statement*statement;
list<Statement*>*statement_list;
svector<Statement*>*statement_list;
verinum* number;
@ -150,6 +150,21 @@ source_file
| source_file description
;
block_item_decl
: K_reg range_opt register_variable_list ';'
| K_integer list_of_variables ';'
;
block_item_decls
: block_item_decl
| block_item_decls block_item_decl
;
block_item_decls_opt
: block_item_decls
|
;
case_item
: expression_list ':' statement_opt
{ PCase::Item*tmp = new PCase::Item;
@ -1247,10 +1262,35 @@ statement
$$ = 0;
}
| K_begin statement_list K_end
{ $$ = pform_make_block(PBlock::BL_SEQ, $2); }
| K_begin ':' IDENTIFIER statement_list K_end
{ yyerror(@3, "Sorry, block identifiers not supported.");
$$ = pform_make_block(PBlock::BL_SEQ, $4);
{ PBlock*tmp = new PBlock(PBlock::BL_SEQ, *$2);
tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line);
delete $2;
$$ = tmp;
}
| K_begin ':' IDENTIFIER
{ pform_push_scope(*$3); }
block_item_decls_opt
statement_list K_end
{ pform_pop_scope();
PBlock*tmp = new PBlock(*$3, PBlock::BL_SEQ, *$6);
tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line);
delete $3;
delete $6;
$$ = tmp;
}
| K_begin K_end
{ PBlock*tmp = new PBlock(PBlock::BL_SEQ);
tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line);
$$ = tmp;
}
| K_begin ':' IDENTIFIER K_end
{ PBlock*tmp = new PBlock(PBlock::BL_SEQ);
tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line);
$$ = tmp;
}
| K_begin error K_end
{ yyerrok; }
@ -1274,7 +1314,12 @@ statement
$$ = tmp;
}
| K_fork statement_list K_join
{ $$ = pform_make_block(PBlock::BL_PAR, $2); }
{ PBlock*tmp = new PBlock(PBlock::BL_PAR, *$2);
tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line);
delete $2;
$$ = tmp;
}
| K_release lavalue ';'
{ yyerror(@1, "Sorry, release not supported.");
$$ = 0;
@ -1285,12 +1330,12 @@ statement
tmp->set_lineno(@1.first_line);
$$ = tmp;
}
| K_begin K_end
{ $$ = pform_make_block(PBlock::BL_SEQ, 0); }
| K_begin ':' IDENTIFIER K_end
{ $$ = pform_make_block(PBlock::BL_SEQ, 0); }
| K_fork K_join
{ $$ = pform_make_block(PBlock::BL_PAR, 0); }
{ PBlock*tmp = new PBlock(PBlock::BL_PAR);
tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line);
$$ = tmp;
}
| K_case '(' expression ')' case_items K_endcase
{ PCase*tmp = new PCase($3, $5);
tmp->set_file(@1.text);
@ -1438,13 +1483,13 @@ statement
statement_list
: statement_list statement
{ list<Statement*>*tmp = $1;
tmp->push_back($2);
{ svector<Statement*>*tmp = new svector<Statement*>(*$1, $2);
delete $1;
$$ = tmp;
}
| statement
{ list<Statement*>*tmp = new list<Statement*>();
tmp->push_back($1);
{ svector<Statement*>*tmp = new svector<Statement*>(1);
(*tmp)[0] = $1;
$$ = tmp;
}
;
@ -1459,10 +1504,10 @@ task_body
;
task_item
: K_input range_opt list_of_variables ';'
: block_item_decl
| K_input range_opt list_of_variables ';'
| K_output range_opt list_of_variables ';'
| K_inout range_opt list_of_variables ';'
| K_reg range_opt list_of_variables ';'
;
task_item_list

View File

@ -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.29 1999/06/21 01:02:16 steve Exp $"
#ident "$Id: pform.cc,v 1.30 1999/06/24 04:24:18 steve Exp $"
#endif
# include "compiler.h"
@ -39,6 +39,43 @@ extern int VLparse();
static Module*cur_module = 0;
/*
* The scope stack and the following functions handle the processing
* of scope. As I enter a scope, the push function is called, and as I
* leave a scope the opo function is called.
*/
struct scope_name_t {
string name;
struct scope_name_t*next;
};
static scope_name_t*scope_stack = 0;
void pform_push_scope(const string&name)
{
scope_name_t*cur = new scope_name_t;
cur->name = name;
cur->next = scope_stack;
scope_stack = cur;
}
void pform_pop_scope()
{
assert(scope_stack);
scope_name_t*cur = scope_stack;
scope_stack = cur->next;
delete cur;
}
static string scoped_name(string name)
{
scope_name_t*cur = scope_stack;
while (cur) {
name = cur->name + "." + name;
cur = cur->next;
}
return name;
}
static map<string,Module*> vl_modules;
static map<string,PUdp*> vl_primitives;
@ -344,9 +381,10 @@ PGAssign* pform_make_pgassign(PExpr*lval, PExpr*rval)
return cur;
}
void pform_makewire(const vlltype&li, const string&name,
void pform_makewire(const vlltype&li, const string&nm,
NetNet::Type type)
{
const string name = scoped_name(nm);
PWire*cur = cur_module->get_wire(name);
if (cur) {
if (cur->get_wire_type() != NetNet::IMPLICIT) {
@ -512,16 +550,6 @@ PProcess* pform_make_behavior(PProcess::Type type, Statement*st)
return pp;
}
Statement* pform_make_block(PBlock::BL_TYPE type, list<Statement*>*sl)
{
if (sl == 0)
sl = new list<Statement*>;
PBlock*bl = new PBlock(type, *sl);
delete sl;
return bl;
}
Statement* pform_make_calltask(string*name, svector<PExpr*>*parms)
{
if (parms == 0)
@ -559,6 +587,11 @@ int pform_parse(const char*path, map<string,Module*>&modules,
/*
* $Log: pform.cc,v $
* Revision 1.30 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.29 1999/06/21 01:02:16 steve
* Fix merging of UDP port type in decls.
*

14
pform.h
View File

@ -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.20 1999/06/15 03:44:53 steve Exp $"
#ident "$Id: pform.h,v 1.21 1999/06/24 04:24:18 steve Exp $"
#endif
# include "netlist.h"
@ -101,6 +101,12 @@ extern void pform_make_udp(string*name, list<string>*parms,
svector<PWire*>*decl, list<string>*table,
Statement*init);
/*
* Enter/exit name scopes.
*/
extern void pform_push_scope(const string&name);
extern void pform_pop_scope();
/*
* The makewire functions announce to the pform code new wires. These
* go into a module that is currently opened.
@ -119,7 +125,6 @@ extern void pform_set_type_attrib(const string&name, const string&key,
const string&value);
extern void pform_set_parameter(const string&name, PExpr*expr);
extern PProcess* pform_make_behavior(PProcess::Type, Statement*);
extern Statement* pform_make_block(PBlock::BL_TYPE, list<Statement*>*);
extern Statement* pform_make_calltask(string*t, svector<PExpr*>* =0);
extern svector<PWire*>* pform_make_udp_input_ports(list<string>*);
@ -151,6 +156,11 @@ extern void pform_dump(ostream&out, Module*mod);
/*
* $Log: pform.h,v $
* Revision 1.21 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.20 1999/06/15 03:44:53 steve
* Get rid of the STL vector template.
*

View File

@ -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.24 1999/06/19 21:06:16 steve Exp $"
#ident "$Id: pform_dump.cc,v 1.25 1999/06/24 04:24:18 steve Exp $"
#endif
/*
@ -275,10 +275,13 @@ void PAssignNB::dump(ostream&out, unsigned ind) const
void PBlock::dump(ostream&out, unsigned ind) const
{
out << setw(ind) << "" << "begin" << endl;
out << setw(ind) << "" << "begin";
if (name_.length())
out << " : " << name_;
out << endl;
for (unsigned idx = 0 ; idx < size() ; idx += 1) {
stat(idx)->dump(out, ind+2);
for (unsigned idx = 0 ; idx < list_.count() ; idx += 1) {
list_[idx]->dump(out, ind+2);
}
out << setw(ind) << "" << "end" << endl;
@ -501,6 +504,11 @@ void PUdp::dump(ostream&out) const
/*
* $Log: pform_dump.cc,v $
* Revision 1.25 1999/06/24 04:24:18 steve
* Handle expression widths for EEE and NEE operators,
* add named blocks and scope handling,
* add registers declared in named blocks.
*
* Revision 1.24 1999/06/19 21:06:16 steve
* Elaborate and supprort to vvm the forever
* and repeat statements.