@@ -155,6 +155,7 @@ ast_node_t* create_node_w_type(ids id, loc_t loc) {
155
155
new_node->types .identifier = NULL ;
156
156
new_node->types .hierarchy = NULL ;
157
157
new_node->chunk_size = 1 ;
158
+ new_node->identifier_node = NULL ;
158
159
/* reset flags */
159
160
new_node->types .variable .is_parameter = false ;
160
161
new_node->types .variable .is_string = false ;
@@ -179,8 +180,12 @@ ast_node_t* create_node_w_type(ids id, loc_t loc) {
179
180
*-------------------------------------------------------------------------*/
180
181
void free_assignement_of_node_keep_tree (ast_node_t * node) {
181
182
if (node) {
182
- int i;
183
+ /* nuke the identifier node first */
184
+ node->identifier_node = free_single_node (node->identifier_node );
185
+ /* then free up the actual ID */
183
186
vtr::free (node->types .identifier );
187
+ node->types .identifier = NULL ;
188
+ /* check the typ and free acordingly afterwards*/
184
189
switch (node->type ) {
185
190
case NUMBERS:
186
191
if (node->types .vnumber != nullptr )
@@ -189,7 +194,7 @@ void free_assignement_of_node_keep_tree(ast_node_t* node) {
189
194
break ;
190
195
191
196
case CONCATENATE:
192
- for (i = 0 ; i < node->types .concat .num_bit_strings ; i++) {
197
+ for (int i = 0 ; i < node->types .concat .num_bit_strings ; i++) {
193
198
if (node->types .concat .bit_strings [i])
194
199
vtr::free (node->types .concat .bit_strings [i]);
195
200
}
@@ -422,14 +427,14 @@ void make_concat_into_list_of_strings(ast_node_t* concat_top, char* instance_nam
422
427
if (var_declare == NULL ) {
423
428
error_message (AST, concat_top->loc , " Missing declaration of this symbol %s\n " , temp_string);
424
429
} else {
425
- if (var_declare->children [1 ] == NULL ) {
430
+ if (var_declare->children [0 ] == NULL ) {
426
431
concat_top->types .concat .num_bit_strings ++;
427
432
concat_top->types .concat .bit_strings = (char **)vtr::realloc (concat_top->types .concat .bit_strings , sizeof (char *) * (concat_top->types .concat .num_bit_strings ));
428
433
concat_top->types .concat .bit_strings [concat_top->types .concat .num_bit_strings - 1 ] = get_name_of_pin_at_bit (concat_top->children [i], -1 , instance_name_prefix, local_ref);
429
- } else if (var_declare->children [3 ] == NULL ) {
434
+ } else if (var_declare->children [2 ] == NULL ) {
430
435
/* reverse thorugh the range since highest bit in index will be lower in the string indx */
431
- rnode[1 ] = var_declare->children [1 ];
432
- rnode[2 ] = var_declare->children [2 ];
436
+ rnode[1 ] = var_declare->children [0 ];
437
+ rnode[2 ] = var_declare->children [1 ];
433
438
oassert (rnode[1 ]->type == NUMBERS && rnode[2 ]->type == NUMBERS);
434
439
435
440
for (j = rnode[1 ]->types .vnumber ->get_value () - rnode[2 ]->types .vnumber ->get_value (); j >= 0 ; j--) {
@@ -447,8 +452,8 @@ void make_concat_into_list_of_strings(ast_node_t* concat_top, char* instance_nam
447
452
concat_top->types .concat .bit_strings = (char **)vtr::realloc (concat_top->types .concat .bit_strings , sizeof (char *) * (concat_top->types .concat .num_bit_strings ));
448
453
concat_top->types .concat .bit_strings [concat_top->types .concat .num_bit_strings - 1 ] = get_name_of_pin_at_bit (concat_top->children [i], 0 , instance_name_prefix, local_ref);
449
454
} else if (concat_top->children [i]->type == RANGE_REF) {
450
- rnode[1 ] = concat_top->children [i]->children [1 ];
451
- rnode[2 ] = concat_top->children [i]->children [2 ];
455
+ rnode[1 ] = concat_top->children [i]->children [0 ];
456
+ rnode[2 ] = concat_top->children [i]->children [1 ];
452
457
oassert (rnode[1 ]->type == NUMBERS && rnode[2 ]->type == NUMBERS);
453
458
oassert (rnode[1 ]->types .vnumber ->get_value () >= rnode[2 ]->types .vnumber ->get_value ());
454
459
int width = abs (rnode[1 ]->types .vnumber ->get_value () - rnode[2 ]->types .vnumber ->get_value ()) + 1 ;
@@ -519,13 +524,13 @@ char* get_name_of_var_declare_at_bit(ast_node_t* var_declare, int bit) {
519
524
char * return_string = NULL ;
520
525
521
526
/* calculate the port details */
522
- if (var_declare->children [1 ] == NULL ) {
527
+ if (var_declare->children [0 ] == NULL ) {
523
528
oassert (bit == 0 );
524
- return_string = make_full_ref_name (NULL , NULL , NULL , var_declare->children [ 0 ] ->types .identifier , -1 );
525
- } else if (var_declare->children [3 ] == NULL ) {
526
- oassert (var_declare->children [2 ]->type == NUMBERS);
527
- return_string = make_full_ref_name (NULL , NULL , NULL , var_declare->children [ 0 ] ->types .identifier , var_declare->children [2 ]->types .vnumber ->get_value () + bit);
528
- } else if (var_declare->children [3 ] != NULL ) {
529
+ return_string = make_full_ref_name (NULL , NULL , NULL , var_declare->identifier_node ->types .identifier , -1 );
530
+ } else if (var_declare->children [2 ] == NULL ) {
531
+ oassert (var_declare->children [1 ]->type == NUMBERS);
532
+ return_string = make_full_ref_name (NULL , NULL , NULL , var_declare->identifier_node ->types .identifier , var_declare->children [1 ]->types .vnumber ->get_value () + bit);
533
+ } else if (var_declare->children [2 ] != NULL ) {
529
534
/* MEMORY output */
530
535
oassert (false );
531
536
}
@@ -539,7 +544,7 @@ char* get_name_of_var_declare_at_bit(ast_node_t* var_declare, int bit) {
539
544
*-------------------------------------------------------------------------------------------*/
540
545
char * get_identifier (ast_node_t * node) {
541
546
if (node->type == ARRAY_REF || node->type == RANGE_REF) {
542
- return node->children [ 0 ] ->types .identifier ;
547
+ return node->identifier_node ->types .identifier ;
543
548
} else {
544
549
oassert (node->type == IDENTIFIERS);
545
550
return node->types .identifier ;
@@ -551,27 +556,29 @@ char* get_identifier(ast_node_t* node) {
551
556
* Assume module connections can be one of: Array entry, Concat, Signal, Array range reference
552
557
*-------------------------------------------------------------------------------------------*/
553
558
char * get_name_of_pin_at_bit (ast_node_t * var_node, int bit, char * instance_name_prefix, sc_hierarchy* local_ref) {
559
+ oassert (var_node);
560
+
554
561
char * return_string = NULL ;
555
562
ast_node_t * rnode[3 ] = {0 };
556
563
557
564
// STRING_CACHE *local_symbol_table_sc = local_ref->local_symbol_table_sc;
558
565
559
566
if (var_node->type == ARRAY_REF) {
560
- oassert (var_node->children [ 0 ]-> type == IDENTIFIERS );
561
- oassert (var_node->children [1 ]->type == NUMBERS);
562
- return_string = make_full_ref_name (NULL , NULL , NULL , var_node->children [ 0 ] ->types .identifier , (int )var_node->children [1 ]->types .vnumber ->get_value ());
567
+ oassert (var_node->identifier_node != NULL );
568
+ oassert (var_node->children [0 ]->type == NUMBERS);
569
+ return_string = make_full_ref_name (NULL , NULL , NULL , var_node->identifier_node ->types .identifier , (int )var_node->children [0 ]->types .vnumber ->get_value ());
563
570
} else if (var_node->type == RANGE_REF) {
564
571
oassert (bit >= 0 );
565
572
566
- rnode[1 ] = var_node->children [1 ];
567
- rnode[2 ] = var_node->children [2 ];
573
+ rnode[1 ] = var_node->children [0 ];
574
+ rnode[2 ] = var_node->children [1 ];
568
575
569
- oassert (var_node->children [ 0 ]-> type == IDENTIFIERS );
576
+ oassert (var_node->identifier_node != NULL );
570
577
oassert (rnode[1 ]->type == NUMBERS);
571
578
oassert (rnode[2 ]->type == NUMBERS);
572
579
oassert (rnode[1 ]->types .vnumber ->get_value () >= rnode[2 ]->types .vnumber ->get_value () + bit);
573
580
574
- return_string = make_full_ref_name (NULL , NULL , NULL , var_node->children [ 0 ] ->types .identifier , rnode[2 ]->types .vnumber ->get_value () + bit);
581
+ return_string = make_full_ref_name (NULL , NULL , NULL , var_node->identifier_node ->types .identifier , rnode[2 ]->types .vnumber ->get_value () + bit);
575
582
} else if ((var_node->type == IDENTIFIERS) && (bit == -1 )) {
576
583
return_string = make_full_ref_name (NULL , NULL , NULL , var_node->types .identifier , -1 );
577
584
} else if (var_node->type == IDENTIFIERS) {
@@ -582,11 +589,11 @@ char* get_name_of_pin_at_bit(ast_node_t* var_node, int bit, char* instance_name_
582
589
error_message (AST, var_node->loc , " Missing declaration of this symbol %s\n " , var_node->types .identifier );
583
590
}
584
591
585
- if (symbol_node->children [1 ] == NULL ) {
592
+ if (symbol_node->children [0 ] == NULL ) {
586
593
pin_index = bit;
587
- } else if (symbol_node->children [3 ] == NULL ) {
588
- oassert (symbol_node->children [2 ]->type == NUMBERS);
589
- pin_index = symbol_node->children [2 ]->types .vnumber ->get_value () + bit;
594
+ } else if (symbol_node->children [2 ] == NULL ) {
595
+ oassert (symbol_node->children [1 ]->type == NUMBERS);
596
+ pin_index = symbol_node->children [1 ]->types .vnumber ->get_value () + bit;
590
597
} else
591
598
oassert (false );
592
599
@@ -677,15 +684,15 @@ char_list_t* get_name_of_pins(ast_node_t* var_node, char* instance_name_prefix,
677
684
width = 1 ;
678
685
return_string = (char **)vtr::malloc (sizeof (char *));
679
686
680
- rnode[1 ] = var_node->children [1 ];
687
+ rnode[1 ] = var_node->children [0 ];
681
688
oassert (rnode[1 ] && rnode[1 ]->type == NUMBERS);
682
- oassert (var_node->children [ 0 ]-> type == IDENTIFIERS );
689
+ oassert (var_node->identifier_node != NULL );
683
690
684
- return_string[0 ] = make_full_ref_name (NULL , NULL , NULL , var_node->children [ 0 ] ->types .identifier , rnode[1 ]->types .vnumber ->get_value ());
691
+ return_string[0 ] = make_full_ref_name (NULL , NULL , NULL , var_node->identifier_node ->types .identifier , rnode[1 ]->types .vnumber ->get_value ());
685
692
} else if (var_node->type == RANGE_REF) {
686
- rnode[0 ] = var_node->children [ 0 ] ;
687
- rnode[1 ] = var_node->children [1 ];
688
- rnode[2 ] = var_node->children [2 ];
693
+ rnode[0 ] = var_node->identifier_node ;
694
+ rnode[1 ] = var_node->children [0 ];
695
+ rnode[2 ] = var_node->children [1 ];
689
696
690
697
oassert (rnode[1 ]->type == NUMBERS && rnode[2 ]->type == NUMBERS);
691
698
width = abs (rnode[1 ]->types .vnumber ->get_value () - rnode[2 ]->types .vnumber ->get_value ()) + 1 ;
@@ -710,15 +717,15 @@ char_list_t* get_name_of_pins(ast_node_t* var_node, char* instance_name_prefix,
710
717
vtr::free (temp_string);
711
718
712
719
if (sym_node && sym_node->children && sym_node->type ) {
713
- if (sym_node->children [1 ] == NULL || sym_node->type == BLOCKING_STATEMENT) {
720
+ if (sym_node->children [0 ] == NULL || sym_node->type == BLOCKING_STATEMENT) {
714
721
width = 1 ;
715
722
return_string = (char **)vtr::malloc (sizeof (char *) * width);
716
723
return_string[0 ] = make_full_ref_name (NULL , NULL , NULL , var_node->types .identifier , -1 );
717
- } else if (sym_node->children [2 ] != NULL && sym_node->children [3 ] == NULL ) {
724
+ } else if (sym_node->children [1 ] != NULL && sym_node->children [2 ] == NULL ) {
718
725
int index = 0 ;
719
726
720
- rnode[1 ] = sym_node->children [1 ];
721
- rnode[2 ] = sym_node->children [2 ];
727
+ rnode[1 ] = sym_node->children [0 ];
728
+ rnode[2 ] = sym_node->children [1 ];
722
729
oassert (rnode[1 ]->type == NUMBERS && rnode[2 ]->type == NUMBERS);
723
730
724
731
width = (rnode[1 ]->types .vnumber ->get_value () - rnode[2 ]->types .vnumber ->get_value () + 1 );
@@ -731,7 +738,7 @@ char_list_t* get_name_of_pins(ast_node_t* var_node, char* instance_name_prefix,
731
738
}
732
739
}
733
740
734
- else if (sym_node->children [3 ] != NULL ) {
741
+ else if (sym_node->children [2 ] != NULL ) {
735
742
oassert (false );
736
743
}
737
744
}
@@ -821,13 +828,7 @@ long get_size_of_variable(ast_node_t* node, sc_hierarchy* local_ref) {
821
828
} break ;
822
829
823
830
case ARRAY_REF: {
824
- ast_node_t * sym_node = resolve_hierarchical_name_reference (local_ref, node->children [0 ]->types .identifier );
825
- if (sym_node != NULL ) {
826
- var_declare = sym_node;
827
- break ;
828
- }
829
-
830
- error_message (AST, node->children [0 ]->loc , " Missing declaration of this symbol %s\n " , node->children [0 ]->types .identifier );
831
+ assignment_size = get_size_of_variable (node->identifier_node , local_ref);
831
832
} break ;
832
833
833
834
case RANGE_REF: {
@@ -844,11 +845,11 @@ long get_size_of_variable(ast_node_t* node, sc_hierarchy* local_ref) {
844
845
break ;
845
846
}
846
847
847
- if (var_declare && !(var_declare->children [1 ])) {
848
+ if (var_declare && !(var_declare->children [0 ])) {
848
849
assignment_size = 1 ;
849
- } else if (var_declare && var_declare->children [1 ] && var_declare->children [2 ]) {
850
- ast_node_t * node_max = var_declare->children [1 ];
851
- ast_node_t * node_min = var_declare->children [2 ];
850
+ } else if (var_declare && var_declare->children [0 ] && var_declare->children [1 ]) {
851
+ ast_node_t * node_max = var_declare->children [0 ];
852
+ ast_node_t * node_min = var_declare->children [1 ];
852
853
853
854
oassert (node_min->type == NUMBERS && node_max->type == NUMBERS);
854
855
long range_max = node_max->types .vnumber ->get_value ();
@@ -922,6 +923,7 @@ ast_node_t* ast_node_copy(ast_node_t* node) {
922
923
node_copy->types .vnumber = new VNumber ((*node->types .vnumber ));
923
924
924
925
node_copy->types .identifier = vtr::strdup (node->types .identifier );
926
+ node_copy->identifier_node = ast_node_deep_copy (node_copy->identifier_node );
925
927
node_copy->children = NULL ;
926
928
927
929
return node_copy;
0 commit comments