Collect initializer statements in the pform.

This commit is contained in:
Stephen Williams 2013-06-15 16:24:02 -04:00
parent 633360a0f9
commit d346fb098f
4 changed files with 35 additions and 4 deletions

View File

@ -304,6 +304,12 @@ static void elaborate_scope_class(Design*des, NetScope*scope,
<< "Elaborate scope class " << pclass->pscope_name() << endl;
}
if (! use_type->initialize.empty()) {
cerr << pclass->get_fileline() << ": sorry: "
<< "Class property initializers not supported." << endl;
des->errors += 1;
}
// Class scopes have no parent scope, because references are
// not allowed to escape a class method.
NetScope*class_scope = new NetScope(0, hname_t(pclass->pscope_name()),

View File

@ -181,9 +181,19 @@ void class_type_t::pform_dump(ostream&out, unsigned indent) const
; cur != properties.end() ; ++cur) {
out << " " << cur->first;
}
out << " }" << endl;
}
void class_type_t::pform_dump_init(ostream&out, unsigned indent) const
{
for (vector<Statement*>::const_iterator cur = initialize.begin()
; cur != initialize.end() ; ++cur) {
Statement*curp = *cur;
curp->dump(out,indent+4);
}
}
void struct_member_t::pform_dump(ostream&out, unsigned indent) const
{
out << setw(indent) << "" << type;
@ -1315,6 +1325,7 @@ void PClass::dump(ostream&out, unsigned indent) const
{
out << setw(indent) << "" << "class " << type->name << ";" << endl;
type->pform_dump(out, indent+2);
type->pform_dump_init(out, indent+2);
dump_tasks_(out, indent+2);
dump_funcs_(out, indent+2);
out << setw(indent) << "" << "endclass" << endl;

View File

@ -64,11 +64,15 @@ void pform_class_property(const struct vlltype&loc,
use_type = new uarray_type_t(use_type, pd);
}
if (curp->expr.get()) {
VLerror(loc, "sorry: Initialization expressions for properties not implemented.");
}
pform_cur_class->type->properties[curp->name] = use_type;
if (PExpr*rval = curp->expr.release()) {
PExpr*lval = new PEIdent(curp->name);
FILE_NAME(lval, loc);
PAssign*tmp = new PAssign(lval, rval);
FILE_NAME(tmp, loc);
pform_cur_class->type->initialize.push_back(tmp);
}
}
}

View File

@ -27,6 +27,7 @@
# include "ivl_target.h"
# include <iostream>
# include <list>
# include <vector>
# include <map>
# include <memory>
@ -37,6 +38,7 @@
class Design;
class NetScope;
class PExpr;
class Statement;
class ivl_type_s;
typedef named<verinum> named_number_t;
typedef named<PExpr*> named_pexpr_t;
@ -212,10 +214,18 @@ struct class_type_t : public data_type_t {
: name(n) { }
void pform_dump(std::ostream&out, unsigned indent) const;
void pform_dump_init(std::ostream&out, unsigned indent) const;
// This is the name of the class type.
perm_string name;
// This is a map of the properties. Map the name to the type.
std::map<perm_string, data_type_t*> properties;
// This is an ordered list of property initializers. The name
// is the name of the property to be assigned, and the val is
// the expression that is assigned.
std::vector<Statement*> initialize;
ivl_type_s* elaborate_type(Design*, NetScope*) const;
};