Skip to content

Commit ca194a0

Browse files
authored
Merge pull request verilog-to-routing#898 from CAS-Atlantic/odin_coverity_fix
fix coverity bugs and improve regression speed
2 parents 5f7de2e + 2e084fb commit ca194a0

File tree

38 files changed

+289
-500
lines changed

38 files changed

+289
-500
lines changed

ODIN_II/SRC/ast_elaborate.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ ast_node_t *reduce_expressions(ast_node_t *node, ast_node_t *parent, STRING_CACH
137137
{
138138
case MODULE:
139139
{
140+
oassert(child_skip_list);
140141
// skip identifier
141142
child_skip_list[0] = true;
142143
break;
@@ -177,6 +178,7 @@ ast_node_t *reduce_expressions(ast_node_t *node, ast_node_t *parent, STRING_CACH
177178
}
178179
else
179180
{
181+
oassert(child_skip_list);
180182
// skip identifier
181183
child_skip_list[0] = true;
182184
}
@@ -217,6 +219,8 @@ ast_node_t *reduce_expressions(ast_node_t *node, ast_node_t *parent, STRING_CACH
217219
}
218220
case FOR:
219221
{
222+
oassert(child_skip_list);
223+
220224
// look ahead for parameters in loop conditions
221225
node->children[0] = reduce_expressions(node->children[0], node, local_string_cache_list, max_size, assignment_size, is_generate_region);
222226
node->children[1] = reduce_expressions(node->children[1], node, local_string_cache_list, max_size, assignment_size, is_generate_region);
@@ -500,7 +504,7 @@ ast_node_t *reduce_expressions(ast_node_t *node, ast_node_t *parent, STRING_CACH
500504
break;
501505
}
502506

503-
if (node->num_children > 0 && skip_children == false)
507+
if (child_skip_list && node->num_children > 0 && skip_children == false)
504508
{
505509
/* use while loop and boolean to prevent optimizations
506510
since number of children may change during recursion */

ODIN_II/SRC/ast_util.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,10 +1427,8 @@ void initial_node(ast_node_t *new_node, ids id, int line_number, int file_number
14271427
new_node->file_number = file_number;
14281428
new_node->far_tag = 0;
14291429
new_node->high_number = 0;
1430-
new_node->shared_node = false;
14311430
new_node->hb_port = 0;
14321431
new_node->net_node = 0;
1433-
new_node->is_read_write = 0;
14341432
new_node->types.vnumber = nullptr;
14351433
new_node->types.identifier = NULL;
14361434
}

ODIN_II/SRC/include/odin_types.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,10 +393,8 @@ struct ast_node_t
393393
int file_number = -1;
394394
int related_module_id = -1;
395395

396-
short shared_node;
397396
void *hb_port;
398397
void *net_node;
399-
short is_read_write;
400398

401399
};
402400

ODIN_II/SRC/include/odin_util.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
long shift_left_value_with_overflow_check(long input_value, long shift_by);
1111

1212
std::string get_file_extension(std::string input_file);
13+
void create_directory(std::string path);
1314

1415
const char *name_based_on_op(operation_list op);
1516
const char *name_based_on_ids(ids op);
@@ -55,7 +56,6 @@ int get_pin_number (char *name);
5556
short get_bit(char in);
5657
short get_bit(short in);
5758
char *search_replace(char *src, const char *sKey, const char *rKey, int flag);
58-
bool validate_string_regex(const char *str, const char *pattern);
5959
std::string find_substring(char *src,const char *sKey,int flag);
6060

6161

ODIN_II/SRC/netlist_create_from_ast.cpp

Lines changed: 62 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -147,70 +147,47 @@ void look_for_clocks(netlist_t *netlist);
147147
*/
148148
STRING_CACHE *create_param_table_for_module(ast_node_t* parent_parameter_list, ast_node_t *module_items, char *module_name)
149149
{
150+
oassert(module_items->type == MODULE_ITEMS || module_items->type == FUNCTION_ITEMS);
151+
152+
150153
/* with the top module we need to visit the entire ast tree */
151-
long i, j;
152-
char *temp_string;
153-
char **temp_parameter_list = NULL;
154-
ast_node_t **temp_localparam_list = NULL;
155154
long sc_spot;
156-
oassert(module_items->type == MODULE_ITEMS || module_items->type == FUNCTION_ITEMS);
155+
157156
int parameter_num = 0;
158-
int localparam_num = 0;
159-
int parameter_count = 0;
160-
STRING_CACHE *local_param_table_sc;
157+
char **temp_parameter_list = NULL;
161158

162-
local_param_table_sc = sc_new_string_cache();
159+
STRING_CACHE *local_param_table_sc = sc_new_string_cache();
163160

164161
/* search for VAR_DECLARE_LISTS */
165162
if (module_items->num_children > 0)
166163
{
167-
for(i = 0; i < module_items->num_children; i++)
164+
for(long i = 0; i < module_items->num_children; i++)
168165
{
169166
if(module_items->children[i]->type == VAR_DECLARE_LIST)
170167
{
171168
/* go through the vars in this declare list, resolves the missing identifiers node */
172-
for(j = 0; j < module_items->children[i]->num_children; j++)
169+
for(long j = 0; j < module_items->children[i]->num_children; j++)
173170
{
174171
ast_node_t *var_declare = module_items->children[i]->children[j];
175172

176-
if ((var_declare->types.variable.is_input) ||
177-
(var_declare->types.variable.is_output) ||
178-
(var_declare->types.variable.is_reg) ||
179-
(var_declare->types.variable.is_integer) ||
180-
(var_declare->types.variable.is_genvar) ||
181-
(var_declare->types.variable.is_wire)) continue;
182-
183-
oassert(module_items->children[i]->children[j]->type == VAR_DECLARE);
184-
oassert(var_declare->types.variable.is_parameter || var_declare->types.variable.is_localparam);
185-
186-
/* make the string to add to the string cache */
187-
temp_string = make_full_ref_name(NULL, NULL, NULL, var_declare->children[0]->types.identifier, -1);
188-
189-
if (var_declare->types.variable.is_parameter)
173+
if (var_declare->types.variable.is_parameter || var_declare->types.variable.is_localparam)
190174
{
191-
parameter_num++;
175+
oassert(var_declare->type == VAR_DECLARE);
176+
177+
/* make the string to add to the string cache */
178+
char *temp_string = make_full_ref_name(NULL, NULL, NULL, var_declare->children[0]->types.identifier, -1);
192179
sc_spot = sc_add_string(local_param_table_sc, temp_string);
193180
local_param_table_sc->data[sc_spot] = (void *)var_declare->children[5];
194181

195-
/* add parameter name to list */
196-
if (parameter_num == 1)
197-
temp_parameter_list = (char**) vtr::calloc(parameter_num, sizeof(char*));
198-
else
199-
temp_parameter_list = (char**) vtr::realloc(temp_parameter_list, sizeof(char*)*parameter_num);
200-
201-
temp_parameter_list[parameter_num-1] = temp_string;
202-
}
203-
else if (var_declare->types.variable.is_localparam)
204-
{
205-
localparam_num++;
182+
if (var_declare->types.variable.is_parameter)
183+
{
184+
/* add parameter name to list */
185+
temp_parameter_list = (char**) vtr::realloc(temp_parameter_list, sizeof(char*)*(parameter_num+1));
186+
temp_parameter_list[parameter_num] = vtr::strdup(temp_string);
187+
parameter_num++;
188+
}
206189

207-
/* add to param table once all parameter overrides are dealt with */
208-
if (localparam_num == 1)
209-
temp_localparam_list = (ast_node_t**) vtr::calloc(localparam_num, sizeof(ast_node_t*));
210-
else
211-
temp_localparam_list = (ast_node_t**) vtr::realloc(temp_localparam_list, sizeof(ast_node_t*)*localparam_num);
212-
213-
temp_localparam_list[localparam_num-1] = var_declare;
190+
vtr::free(temp_string);
214191
}
215192
}
216193
}
@@ -219,111 +196,63 @@ STRING_CACHE *create_param_table_for_module(ast_node_t* parent_parameter_list, a
219196

220197
if(parent_parameter_list)
221198
{
222-
/* defparam before calling instance; these overrides must be done first */
223-
for(i = 0; i < parent_parameter_list->num_children; i ++)
199+
if(parameter_num == 0 && parent_parameter_list->num_children > 0)
224200
{
225-
if(parent_parameter_list->children[i]->children[0] && parent_parameter_list->children[i]->shared_node == false)
226-
{
227-
ast_node_t *var_declare = parent_parameter_list->children[i];
228-
sc_spot = sc_lookup_string(local_param_table_sc, var_declare->children[0]->types.identifier);
229-
if(sc_spot == -1)
230-
{
231-
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
232-
"Can't find parameter name %s in module %s\n",
233-
var_declare->children[0]->types.identifier,
234-
module_name);
235-
}
236-
237-
if (var_declare->children[5])
238-
local_param_table_sc->data[sc_spot] = (void *)var_declare->children[5];
239-
}
201+
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
202+
"There is no parameters in %s !",
203+
module_name);
204+
}
205+
else if(parent_parameter_list->num_children > parameter_num)
206+
{
207+
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
208+
"There are more parameters (%d) in %s than there are specified in the module instantiation (%d)!",
209+
parent_parameter_list->num_children, module_name, parameter_num);
210+
}
211+
else if(parent_parameter_list->num_children < parameter_num)
212+
{
213+
warning_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
214+
"There are less parameters (%d) in %s than there are specified in the module instantiation (%d)!",
215+
parent_parameter_list->num_children, module_name, parameter_num);
240216
}
217+
241218

242-
for(i = 0; i < parent_parameter_list->num_children; i ++)
219+
for (long i = 0; i < parent_parameter_list->num_children; i++)
243220
{
244-
// defparam after calling instance
245-
if(parent_parameter_list->children[i]->children[0])
246-
{
247-
if(parent_parameter_list->children[i]->shared_node == true)
248-
{
249-
ast_node_t *var_declare = parent_parameter_list->children[i];
250-
sc_spot = sc_lookup_string(local_param_table_sc, var_declare->children[0]->types.identifier);
251-
if(sc_spot == -1)
252-
{
253-
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
254-
"Can't find parameter name %s in module %s\n",
255-
var_declare->children[0]->types.identifier,
256-
module_name);
257-
}
221+
ast_node_t *var_declare = parent_parameter_list->children[i];
222+
char *identifier = temp_parameter_list[i];
258223

259-
if (var_declare->children[5])
260-
local_param_table_sc->data[sc_spot] = (void *)var_declare->children[5];
261-
}
262-
}
263-
else
224+
if(parent_parameter_list->children[i]->children[0]
225+
&& var_declare->children[0]->types.identifier)
264226
{
265-
// override without name during module instantiation; use name from temp_parameter_list
266-
if (parameter_count < parameter_num)
267-
{
268-
ast_node_t *var_declare = parent_parameter_list->children[i];
269-
sc_spot = sc_lookup_string(local_param_table_sc, temp_parameter_list[parameter_count]);
270-
if(sc_spot == -1)
271-
{
272-
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
273-
"Can't find parameter name %s in module %s\n",
274-
var_declare->children[0]->types.identifier,
275-
module_name);
276-
}
277-
local_param_table_sc->data[sc_spot] = (void *)var_declare->children[5];
278-
}
227+
identifier = var_declare->children[0]->types.identifier;
279228

280-
parameter_count++;
281-
282-
if(parameter_num == 0)
283-
{
284-
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
285-
"There is no parameters in %s !",
286-
module_name);
287-
}
288229
}
289-
}
290230

291-
}
231+
sc_spot = sc_lookup_string(local_param_table_sc, identifier);
232+
if(sc_spot == -1)
233+
{
234+
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
235+
"Can't find parameter name %s in module %s\n",
236+
var_declare->children[0]->types.identifier,
237+
module_name);
238+
}
292239

293-
if(parameter_count && parameter_count != parameter_num)
294-
{
295-
if(parameter_count > parameter_num)
296-
{
297-
error_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
298-
"There are more parameters (%d) in %s than there are specified in the module instantiation (%d)!",
299-
parameter_count, module_name, parameter_num);
300-
}
301-
else if(parameter_count < parameter_num)
302-
{
303-
warning_message(NETLIST_ERROR, parent_parameter_list->line_number, parent_parameter_list->file_number,
304-
"There are less parameters (%d) in %s than there are specified in the module instantiation (%d)!",
305-
parameter_count, module_name, parameter_num);
240+
if (var_declare->children[5])
241+
{
242+
local_param_table_sc->data[sc_spot] = (void *)var_declare->children[5];
243+
}
306244
}
307245
}
308-
}
309246

310-
/* add localparams */
311-
for (i = 0; i < localparam_num; i++) {
312-
/* add to string cache */
313-
temp_string = make_full_ref_name(NULL, NULL, NULL, temp_localparam_list[i]->children[0]->types.identifier, -1);
314-
sc_spot = sc_add_string(local_param_table_sc, temp_string);
315-
local_param_table_sc->data[sc_spot] = (void *)temp_localparam_list[i]->children[5];
316-
317-
/* add to temp param list */
318-
parameter_num++;
319-
temp_parameter_list = (char**) vtr::realloc(temp_parameter_list, sizeof(char*)*parameter_num);
320-
temp_parameter_list[parameter_num-1] = temp_string;
321247
}
322248

323249
/* clean up */
324-
if (temp_parameter_list) {
325-
for (i = 0; i < parameter_num; i++) {
326-
vtr::free(temp_parameter_list[i]);
250+
if (temp_parameter_list)
251+
{
252+
while (parameter_num)
253+
{
254+
parameter_num -= 1;
255+
vtr::free(temp_parameter_list[parameter_num]);
327256
}
328257
vtr::free(temp_parameter_list);
329258
}

0 commit comments

Comments
 (0)