@@ -2704,15 +2704,69 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
2704
2704
address->count = right_memory->addr_width ;
2705
2705
}
2706
2706
2707
- add_input_port_to_implicit_memory (right_memory, address, " addr1" );
2707
+ int input_pin_index = 0 ;
2708
+ int output_pin_index = 0 ;
2709
+ char * address_port = NULL ;
2710
+ char * output_port = NULL ;
2711
+
2712
+ ast_node_t * right_memory_ast_node = right_memory->node ->related_ast_node ;
2713
+
2714
+ bool first_address_is_connected = is_signal_list_connected_to_memory (right_memory, address, " addr1" );
2715
+ bool second_address_is_connected = is_signal_list_connected_to_memory (right_memory, address, " addr2" );
2716
+ bool memory_is_single_port = !strcmp (right_memory_ast_node->identifier_node ->types .identifier , SINGLE_PORT_RAM_string);
2717
+
2718
+ if (memory_is_single_port && !first_address_is_connected) {
2719
+ if (right_memory->node ->input_pins ) {
2720
+ address_port = right_memory->node ->input_pins [0 ]->mapping ;
2721
+
2722
+ if (address_port && !strcmp (address_port, " addr1" )) {
2723
+ // changing to a dual-port ram, since the first port is already connected
2724
+ ast_node_t * identifier_node = create_tree_node_id (vtr::strdup (DUAL_PORT_RAM_string), assignment->loc );
2725
+
2726
+ // free the default identifier node (spram)
2727
+ if (right_memory_ast_node->identifier_node ) {
2728
+ free_single_node (right_memory_ast_node->identifier_node );
2729
+ }
2730
+
2731
+ right_memory_ast_node->identifier_node = identifier_node;
2732
+
2733
+ input_pin_index = right_memory->data_width + right_memory->data_width + right_memory->addr_width + 2 ;
2734
+ output_pin_index = right_memory->data_width ;
2735
+
2736
+ // first address port is already been used, so that the second port should use for the next address port
2737
+ address_port = vtr::strdup (" addr2" );
2738
+ output_port = vtr::strdup (" out2" );
2739
+ }
2740
+
2741
+ } else {
2742
+ address_port = vtr::strdup (" addr1" );
2743
+ output_port = vtr::strdup (" out1" );
2744
+ }
2745
+
2746
+ add_input_port_to_implicit_memory (right_memory, address, address_port);
2747
+
2748
+ } else if (!memory_is_single_port && second_address_is_connected) {
2749
+ input_pin_index = right_memory->data_width + right_memory->data_width + right_memory->addr_width + 2 ;
2750
+ output_pin_index = right_memory->data_width ;
2751
+
2752
+ address_port = vtr::strdup (" addr2" );
2753
+ output_port = vtr::strdup (" out2" );
2754
+
2755
+ } else if (first_address_is_connected) {
2756
+ address_port = vtr::strdup (" addr1" );
2757
+ output_port = vtr::strdup (" out1" );
2758
+ }
2759
+
2708
2760
// Right inputs are the inputs to the memory. This will contain the address only.
2709
2761
right_inputs = init_signal_list ();
2710
2762
char * name = right->identifier_node ->types .identifier ;
2711
- for (int i = 0 ; i < address->count ; i++) {
2763
+
2764
+ int i;
2765
+ for (i = 0 ; i < address->count ; i++) {
2712
2766
npin_t * pin = address->pins [i];
2713
2767
if (pin->name )
2714
2768
vtr::free (pin->name );
2715
- pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, i);
2769
+ pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, input_pin_index + i);
2716
2770
add_pin_to_signal_list (right_inputs, pin);
2717
2771
}
2718
2772
free_signal_list (address);
@@ -2721,19 +2775,22 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
2721
2775
// treated the same as the outputs from the RHS of any assignment.
2722
2776
right_outputs = init_signal_list ();
2723
2777
signal_list_t * outputs = init_signal_list ();
2724
- for (int i = 0 ; i < right_memory->data_width ; i++) {
2778
+ for (i = output_pin_index ; i < right_memory->data_width + output_pin_index ; i++) {
2725
2779
npin_t * pin = allocate_npin ();
2726
2780
add_pin_to_signal_list (outputs, pin);
2727
- pin->name = make_full_ref_name (" " , NULL , NULL , right_memory-> node -> name , i);
2781
+ pin->name = make_full_ref_name (right_memory-> node -> name , NULL , NULL , output_port , i - output_pin_index );
2728
2782
nnet_t * net = allocate_nnet ();
2729
2783
add_driver_pin_to_net (net, pin);
2730
2784
pin = allocate_npin ();
2731
2785
add_fanout_pin_to_net (net, pin);
2732
2786
// right_outputs->pins[i] = pin;
2733
2787
add_pin_to_signal_list (right_outputs, pin);
2734
2788
}
2735
- add_output_port_to_implicit_memory (right_memory, outputs, " out1 " );
2789
+ add_output_port_to_implicit_memory (right_memory, outputs, output_port );
2736
2790
free_signal_list (outputs);
2791
+
2792
+ vtr::free (address_port);
2793
+ vtr::free (output_port);
2737
2794
}
2738
2795
2739
2796
} else {
@@ -2783,36 +2840,90 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
2783
2840
address->count = left_memory->addr_width ;
2784
2841
}
2785
2842
2786
- add_input_port_to_implicit_memory (left_memory, address, " addr2" );
2787
-
2788
2843
signal_list_t * data;
2789
2844
if (right_memory)
2790
2845
data = right_outputs;
2791
2846
else
2792
2847
data = in_1;
2793
2848
2849
+ int input_pin_index = 0 ;
2850
+ char * address_port = NULL ;
2851
+ char * data_port = NULL ;
2852
+ char * we_port = NULL ;
2853
+
2854
+ ast_node_t * left_memory_ast_node = left_memory->node ->related_ast_node ;
2855
+
2856
+ bool first_address_is_connected = is_signal_list_connected_to_memory (left_memory, address, " addr1" );
2857
+ bool second_address_is_connected = is_signal_list_connected_to_memory (left_memory, address, " addr2" );
2858
+ bool memory_is_single_port = !strcmp (left_memory_ast_node->identifier_node ->types .identifier , SINGLE_PORT_RAM_string);
2859
+
2860
+ if (memory_is_single_port && !first_address_is_connected) {
2861
+ if (left_memory->node ->input_pins ) {
2862
+ address_port = left_memory->node ->input_pins [0 ]->mapping ;
2863
+
2864
+ if (address_port && !strcmp (address_port, " addr1" )) {
2865
+ // changing to a dual-port ram, since the first port is already connected
2866
+ ast_node_t * identifier_node = create_tree_node_id (vtr::strdup (DUAL_PORT_RAM_string), assignment->loc );
2867
+
2868
+ // free the default identifier node (spram)
2869
+ if (left_memory_ast_node->identifier_node ) {
2870
+ free_single_node (left_memory_ast_node->identifier_node );
2871
+ }
2872
+
2873
+ left_memory_ast_node->identifier_node = identifier_node;
2874
+
2875
+ input_pin_index = left_memory->data_width + left_memory->data_width + left_memory->addr_width + 2 ;
2876
+
2877
+ // first address port is already been used, so that the second port should use for the next address port
2878
+ address_port = vtr::strdup (" addr2" );
2879
+ data_port = vtr::strdup (" data2" );
2880
+ we_port = vtr::strdup (" we2" );
2881
+ }
2882
+
2883
+ } else {
2884
+ address_port = vtr::strdup (" addr1" );
2885
+ data_port = vtr::strdup (" data1" );
2886
+ we_port = vtr::strdup (" we1" );
2887
+ }
2888
+
2889
+ add_input_port_to_implicit_memory (left_memory, address, address_port);
2890
+
2891
+ } else if (!memory_is_single_port && second_address_is_connected) {
2892
+ input_pin_index = left_memory->data_width + left_memory->data_width + left_memory->addr_width + 2 ;
2893
+
2894
+ // first address port is already been used, so that the second port should use for the next address port
2895
+ address_port = vtr::strdup (" addr2" );
2896
+ data_port = vtr::strdup (" data2" );
2897
+ we_port = vtr::strdup (" we2" );
2898
+
2899
+ } else if (first_address_is_connected) {
2900
+ address_port = vtr::strdup (" addr1" );
2901
+ data_port = vtr::strdup (" data1" );
2902
+ we_port = vtr::strdup (" we1" );
2903
+ }
2904
+
2794
2905
// Pad/shrink the data to the width of the memory.
2795
2906
if (data) {
2796
2907
while (data->count < left_memory->data_width )
2797
2908
add_pin_to_signal_list (data, get_zero_pin (verilog_netlist));
2798
2909
2799
2910
data->count = left_memory->data_width ;
2800
2911
2801
- add_input_port_to_implicit_memory (left_memory, data, " data2 " );
2912
+ add_input_port_to_implicit_memory (left_memory, data, data_port );
2802
2913
2803
2914
signal_list_t * we = init_signal_list ();
2804
2915
add_pin_to_signal_list (we, get_one_pin (verilog_netlist));
2805
- add_input_port_to_implicit_memory (left_memory, we, " we2 " );
2916
+ add_input_port_to_implicit_memory (left_memory, we, we_port );
2806
2917
2807
2918
in_1 = init_signal_list ();
2808
2919
char * name = left->identifier_node ->types .identifier ;
2920
+
2809
2921
int i;
2810
- int pin_index = left_memory->data_width + left_memory->data_width + left_memory->addr_width + 2 ;
2811
2922
for (i = 0 ; i < address->count ; i++) {
2812
2923
npin_t * pin = address->pins [i];
2813
2924
if (pin->name )
2814
2925
vtr::free (pin->name );
2815
- pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, pin_index ++);
2926
+ pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, input_pin_index ++);
2816
2927
add_pin_to_signal_list (in_1, pin);
2817
2928
}
2818
2929
free_signal_list (address);
@@ -2821,7 +2932,7 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
2821
2932
npin_t * pin = data->pins [i];
2822
2933
if (pin->name )
2823
2934
vtr::free (pin->name );
2824
- pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, pin_index ++);
2935
+ pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, input_pin_index ++);
2825
2936
add_pin_to_signal_list (in_1, pin);
2826
2937
}
2827
2938
free_signal_list (data);
@@ -2830,13 +2941,17 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
2830
2941
npin_t * pin = we->pins [i];
2831
2942
if (pin->name )
2832
2943
vtr::free (pin->name );
2833
- pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, pin_index ++);
2944
+ pin->name = make_full_ref_name (instance_name_prefix, NULL , NULL , name, input_pin_index ++);
2834
2945
add_pin_to_signal_list (in_1, pin);
2835
2946
}
2836
2947
free_signal_list (we);
2837
2948
2838
2949
out_list = NULL ;
2839
2950
}
2951
+
2952
+ vtr::free (address_port);
2953
+ vtr::free (data_port);
2954
+ vtr::free (we_port);
2840
2955
}
2841
2956
}
2842
2957
} else {
0 commit comments