@@ -147,70 +147,47 @@ void look_for_clocks(netlist_t *netlist);
147147 */
148148STRING_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