Support for enumerations in classes.

This commit is contained in:
Stephen Williams 2019-09-29 18:27:27 -07:00
parent d7ee6bb6bb
commit 50d71c8512
3 changed files with 45 additions and 4 deletions

View File

@ -480,7 +480,9 @@ static void elaborate_scope_class(Design*des, NetScope*scope, PClass*pclass)
if (debug_scopes) {
cerr << pclass->get_fileline() <<": elaborate_scope_class: "
<< "Elaborate scope class " << pclass->pscope_name() << endl;
<< "Elaborate scope class " << pclass->pscope_name()
<< " within scope " << scope_path(scope)
<< endl;
}
class_type_t*base_class = dynamic_cast<class_type_t*> (use_type->base_type);
@ -518,12 +520,24 @@ static void elaborate_scope_class(Design*des, NetScope*scope, PClass*pclass)
use_class->set_definition_scope(scope);
set_scope_timescale(des, class_scope, pclass);
// Elaborate enum types declared in the class. We need these
// now because enumeration constants can be used during scope
// elaboration.
if (debug_scopes) {
cerr << pclass->get_fileline() << ": elaborate_scope_class: "
<< "Elaborate " << pclass->enum_sets.size() << " enumerations"
<< " in class " << scope_path(class_scope)
<< ", scope=" << scope_path(scope) << "."
<< endl;
}
elaborate_scope_enumerations(des, class_scope, pclass->enum_sets);
// Collect the properties, elaborate them, and add them to the
// elaborated class definition.
for (map<perm_string, class_type_t::prop_info_t>::iterator cur = use_type->properties.begin()
; cur != use_type->properties.end() ; ++ cur) {
ivl_type_s*tmp = cur->second.type->elaborate_type(des, scope);
ivl_type_s*tmp = cur->second.type->elaborate_type(des, class_scope);
ivl_assert(*pclass, tmp);
if (debug_scopes) {
cerr << pclass->get_fileline() << ": elaborate_scope_class: "
@ -789,7 +803,15 @@ bool PPackage::elaborate_scope(Design*des, NetScope*scope)
collect_scope_parameters_(des, scope, parameters);
collect_scope_localparams_(des, scope, localparams);
if (debug_scopes) {
cerr << get_fileline() << ": PPackage::elaborate_scope: "
<< "Elaborate " << enum_sets.size() << " enumerations"
<< " in package scope " << scope_path(scope) << "."
<< endl;
}
elaborate_scope_enumerations(des, scope, enum_sets);
elaborate_scope_classes(des, scope, classes_lexical);
elaborate_scope_funcs(des, scope, funcs);
elaborate_scope_tasks(des, scope, tasks);
@ -826,6 +848,12 @@ bool Module::elaborate_scope(Design*des, NetScope*scope,
replace_scope_parameters_(scope, *this, replacements);
if (debug_scopes) {
cerr << get_fileline() << ": Module::elaborate_scope: "
<< "Elaborate " << enum_sets.size() << " enumerations"
<< " in scope " << scope_path(scope) << "."
<< endl;
}
elaborate_scope_enumerations(des, scope, enum_sets);
assert(classes.size() == classes_lexical.size());

13
parse.y
View File

@ -864,7 +864,7 @@ class_item /* IEEE1800-2005: A.1.8 */
current_function = 0;
}
/* Class properties... */
/* IEEE1800-2017: A.1.9 Class items: Class properties... */
| property_qualifier_opt data_type list_of_variable_decl_assignments ';'
{ pform_class_property(@2, $1, $2, $3); }
@ -872,7 +872,16 @@ class_item /* IEEE1800-2005: A.1.8 */
| K_const class_item_qualifier_opt data_type list_of_variable_decl_assignments ';'
{ pform_class_property(@1, $2 | property_qualifier_t::make_const(), $3, $4); }
/* Class methods... */
/* IEEEE1800-2017: A.1.9 Class items: class_item ::= { property_qualifier} data_declaration */
| property_qualifier_opt K_typedef data_type IDENTIFIER dimensions_opt ';'
{ perm_string name = lex_strings.make($4);
delete[]$4;
yyerror(@2, "sorry: Class-local typedefs not yet supported.");
delete $3;
}
/* IEEE1800-1017: A.1.9 Class items: Class methods... */
| method_qualifier_opt task_declaration
{ /* The task_declaration rule puts this into the class */ }

View File

@ -67,6 +67,10 @@ void pform_class_property(const struct vlltype&loc,
{
assert(pform_cur_class);
if (enum_type_t*enum_set = dynamic_cast<enum_type_t*>(data_type)) {
pform_cur_class->enum_sets .insert(enum_set);
}
// Add the non-static properties to the class type
// object. Unwind the list of names to make a map of name to
// type.