Skip to content

Commit f617a87

Browse files
emacdo12jeanlego
emacdo12
authored andcommitted
Odin: fix localparams
this commit: - warn defparams that don't exist or try to override localparam - defparam cannot override localparam - resolve localparam alongside param
1 parent 2397b83 commit f617a87

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

ODIN_II/SRC/ast_elaborate.cpp

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2212,40 +2212,36 @@ void update_instance_parameter_table(ast_node_t* instance, STRING_CACHE* instanc
22122212
char* param_id = parameter_override_list->children[j]->children[0]->types.identifier;
22132213
sc_spot = sc_lookup_string(instance_param_table_sc, param_id);
22142214
if (sc_spot == -1) {
2215-
error_message(AST, parameter_override_list->loc,
2216-
"Can't find parameter name %s in module %s\n",
2217-
param_id, instance->children[0]->types.identifier);
2215+
warning_message(AST, parameter_override_list->loc,
2216+
"Can't find parameter name %s in module %s\n",
2217+
param_id, instance->children[0]->types.identifier);
22182218
} else {
2219-
/* update this parameter and remove all other overrides with this name */
2220-
free_whole_tree(((ast_node_t*)instance_param_table_sc->data[sc_spot]));
2221-
instance_param_table_sc->data[sc_spot] = (void*)parameter_override_list->children[j]->children[5];
2222-
parameter_override_list->children[j]->children[5] = NULL;
2219+
ast_node_t* param_node = (ast_node_t*)instance_param_table_sc->data[sc_spot];
2220+
if (param_node == NULL) {
2221+
instance_param_table_sc->data[sc_spot] = (void*)parameter_override_list->children[j]->children[5];
2222+
} else if (!param_node->types.variable.is_parameter) {
2223+
warning_message(AST, parameter_override_list->loc,
2224+
"Defparam can only override parameters: %s\n",
2225+
parameter_override_list->children[j]->children[0]->types.identifier);
2226+
} else {
2227+
/* update this parameter and remove all other overrides with this name */
2228+
free_whole_tree(((ast_node_t*)instance_param_table_sc->data[sc_spot]));
2229+
instance_param_table_sc->data[sc_spot] = (void*)parameter_override_list->children[j]->children[5];
2230+
parameter_override_list->children[j]->children[5] = NULL;
2231+
}
22232232

22242233
for (int k = 0; k < j; k++) {
22252234
if (!strcmp(parameter_override_list->children[k]->children[0]->types.identifier, param_id)) {
2226-
/**
2227-
* TODO: is this needed?
2228-
* ast_node_t* temp = parameter_override_list->children[k];
2229-
* */
22302235
remove_child_from_node_at_index(parameter_override_list, k);
2231-
//temp = NULL;
22322236
j--;
22332237
k--;
22342238
}
22352239
}
2236-
/**
2237-
* TODO: is this needed?
2238-
* ast_node_t* temp = parameter_override_list->children[j];
2239-
* */
22402240
remove_child_from_node_at_index(parameter_override_list, j);
2241-
//temp = NULL;
22422241
}
22432242
}
22442243
// check if there are still overrides in the list that haven't been deleted
2245-
2246-
if (parameter_override_list->num_children > 0) {
2247-
oassert(false); // not reachable???
2248-
}
2244+
oassert(parameter_override_list->num_children == 0);
22492245
}
22502246
}
22512247

ODIN_II/SRC/parse_making_ast.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,9 @@ static ast_node_t* resolve_symbol_node(ast_node_t* symbol_node) {
285285
newNode = (ast_node_t*)current_scope->param_sc->data[sc_spot];
286286
}
287287

288-
if (newNode && newNode->types.variable.is_parameter == true) {
288+
if (newNode
289+
&& (newNode->types.variable.is_localparam
290+
|| newNode->types.variable.is_parameter)) {
289291
to_return = symbol_node;
290292
} else {
291293
error_message(AST, symbol_node->loc,

0 commit comments

Comments
 (0)