Skip to content

Commit ab0af2f

Browse files
committed
Merge remote-tracking branch 'upstream/master' into fix_parse_runtime
2 parents 74db344 + 574525c commit ab0af2f

File tree

105 files changed

+4633
-1251
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+4633
-1251
lines changed

.github/kokoro/steps/vtr-test.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ echo "========================================"
4545
echo "Running Tests"
4646
echo "========================================"
4747
export VPR_NUM_WORKERS=1
48+
49+
set +e
4850
./run_reg_test.py $VTR_TEST $VTR_TEST_OPTIONS -j$NUM_CORES
51+
TEST_RESULT=$?
52+
set -e
4953
kill $MONITOR
5054

5155
echo "========================================"
@@ -70,3 +74,5 @@ if [[ $(du -s | cut -d $'\t' -f 1) -gt $(expr 1024 \* 1024 \* 90) ]]; then
7074
echo "Working directory too large!"
7175
exit 1
7276
fi
77+
78+
exit $TEST_RESULT

ODIN_II/SRC/implicit_memory.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,39 @@ char is_valid_implicit_memory_reference_ast(char* instance_name_prefix, ast_node
9797
return false;
9898
}
9999

100+
bool is_signal_list_connected_to_memory(implicit_memory* memory, signal_list_t* signals, const char* port_name) {
101+
oassert(port_name);
102+
103+
bool signals_are_connected = true;
104+
// is any port of the memory connected
105+
if (memory->node->input_port_sizes) {
106+
int i, j;
107+
long pin_index = 0;
108+
for (i = 0; i < memory->node->num_input_port_sizes; i++) {
109+
int input_port_size = memory->node->input_port_sizes[i];
110+
111+
for (j = 0; signals_are_connected && (input_port_size == signals->count) && j < signals->count; j++) {
112+
npin_t* memory_input_pin = memory->node->input_pins[pin_index + j];
113+
114+
if (!strcmp(memory_input_pin->mapping, port_name)) {
115+
if (memory_input_pin->net->name && signals->pins[j]->net->name) {
116+
if (strcmp(memory_input_pin->net->name, signals->pins[j]->net->name)) {
117+
signals_are_connected = false;
118+
}
119+
} else {
120+
signals_are_connected = false;
121+
}
122+
}
123+
}
124+
pin_index += input_port_size;
125+
}
126+
} else {
127+
signals_are_connected = false;
128+
}
129+
130+
return signals_are_connected;
131+
}
132+
100133
/*
101134
* Creates an implicit memory block with the given depth and data width, and the given name and prefix.
102135
*/
@@ -127,7 +160,7 @@ implicit_memory* create_implicit_memory_block(int data_width, long memory_depth,
127160
// Create a fake ast node.
128161
node->related_ast_node = create_node_w_type(RAM, node->loc);
129162
node->related_ast_node->children = (ast_node_t**)vtr::calloc(1, sizeof(ast_node_t*));
130-
node->related_ast_node->identifier_node = create_tree_node_id(vtr::strdup(DUAL_PORT_RAM_string), loc);
163+
node->related_ast_node->identifier_node = create_tree_node_id(vtr::strdup(SINGLE_PORT_RAM_string), loc);
131164

132165
char* full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name, -1);
133166

@@ -182,8 +215,8 @@ implicit_memory* lookup_implicit_memory_input(char* name) {
182215
void register_implicit_memory_input(char* name, implicit_memory* memory) {
183216
if (!lookup_implicit_memory_input(name))
184217
implicit_memory_inputs.insert({std::string(name), memory});
185-
else
186-
error_message(NETLIST, memory->node->loc, "Attempted to re-register implicit memory output %s.", name);
218+
// else
219+
// error_message(NETLIST, memory->node->loc, "Attempted to re-register implicit memory output %s.", name);
187220
}
188221

189222
/*

ODIN_II/SRC/include/implicit_memory.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ void add_output_port_to_implicit_memory(implicit_memory* memory, signal_list_t*
4545
implicit_memory* lookup_implicit_memory_reference_ast(char* instance_name_prefix, ast_node_t* node);
4646

4747
char is_valid_implicit_memory_reference_ast(char* instance_name_prefix, ast_node_t* node);
48+
bool is_signal_list_connected_to_memory(implicit_memory* memory, signal_list_t* signals, const char* port_name);
4849

4950
implicit_memory* create_implicit_memory_block(int data_width, long words, char* name, char* instance_name_prefix, loc_t loc);
5051

ODIN_II/SRC/netlist_create_from_ast.cpp

Lines changed: 129 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2704,15 +2704,69 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
27042704
address->count = right_memory->addr_width;
27052705
}
27062706

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+
27082760
// Right inputs are the inputs to the memory. This will contain the address only.
27092761
right_inputs = init_signal_list();
27102762
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++) {
27122766
npin_t* pin = address->pins[i];
27132767
if (pin->name)
27142768
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);
27162770
add_pin_to_signal_list(right_inputs, pin);
27172771
}
27182772
free_signal_list(address);
@@ -2721,19 +2775,22 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
27212775
// treated the same as the outputs from the RHS of any assignment.
27222776
right_outputs = init_signal_list();
27232777
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++) {
27252779
npin_t* pin = allocate_npin();
27262780
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);
27282782
nnet_t* net = allocate_nnet();
27292783
add_driver_pin_to_net(net, pin);
27302784
pin = allocate_npin();
27312785
add_fanout_pin_to_net(net, pin);
27322786
//right_outputs->pins[i] = pin;
27332787
add_pin_to_signal_list(right_outputs, pin);
27342788
}
2735-
add_output_port_to_implicit_memory(right_memory, outputs, "out1");
2789+
add_output_port_to_implicit_memory(right_memory, outputs, output_port);
27362790
free_signal_list(outputs);
2791+
2792+
vtr::free(address_port);
2793+
vtr::free(output_port);
27372794
}
27382795

27392796
} else {
@@ -2783,36 +2840,90 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
27832840
address->count = left_memory->addr_width;
27842841
}
27852842

2786-
add_input_port_to_implicit_memory(left_memory, address, "addr2");
2787-
27882843
signal_list_t* data;
27892844
if (right_memory)
27902845
data = right_outputs;
27912846
else
27922847
data = in_1;
27932848

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+
27942905
// Pad/shrink the data to the width of the memory.
27952906
if (data) {
27962907
while (data->count < left_memory->data_width)
27972908
add_pin_to_signal_list(data, get_zero_pin(verilog_netlist));
27982909

27992910
data->count = left_memory->data_width;
28002911

2801-
add_input_port_to_implicit_memory(left_memory, data, "data2");
2912+
add_input_port_to_implicit_memory(left_memory, data, data_port);
28022913

28032914
signal_list_t* we = init_signal_list();
28042915
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);
28062917

28072918
in_1 = init_signal_list();
28082919
char* name = left->identifier_node->types.identifier;
2920+
28092921
int i;
2810-
int pin_index = left_memory->data_width + left_memory->data_width + left_memory->addr_width + 2;
28112922
for (i = 0; i < address->count; i++) {
28122923
npin_t* pin = address->pins[i];
28132924
if (pin->name)
28142925
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++);
28162927
add_pin_to_signal_list(in_1, pin);
28172928
}
28182929
free_signal_list(address);
@@ -2821,7 +2932,7 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
28212932
npin_t* pin = data->pins[i];
28222933
if (pin->name)
28232934
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++);
28252936
add_pin_to_signal_list(in_1, pin);
28262937
}
28272938
free_signal_list(data);
@@ -2830,13 +2941,17 @@ signal_list_t* assignment_alias(ast_node_t* assignment, char* instance_name_pref
28302941
npin_t* pin = we->pins[i];
28312942
if (pin->name)
28322943
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++);
28342945
add_pin_to_signal_list(in_1, pin);
28352946
}
28362947
free_signal_list(we);
28372948

28382949
out_list = NULL;
28392950
}
2951+
2952+
vtr::free(address_port);
2953+
vtr::free(data_port);
2954+
vtr::free(we_port);
28402955
}
28412956
}
28422957
} else {

ODIN_II/SRC/netlist_utils.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,15 @@ signal_list_t* combine_lists(signal_list_t** signal_lists, int num_signal_lists)
589589
if (signal_lists[i]) {
590590
int j;
591591
for (j = 0; j < signal_lists[i]->count; j++) {
592-
add_pin_to_signal_list(signal_lists[0], signal_lists[i]->pins[j]);
592+
int k;
593+
bool pin_already_added = false;
594+
for (k = 0; k < signal_lists[0]->count; k++) {
595+
if (!strcmp(signal_lists[0]->pins[k]->name, signal_lists[i]->pins[j]->name))
596+
pin_already_added = true;
597+
}
598+
599+
if (!pin_already_added)
600+
add_pin_to_signal_list(signal_lists[0], signal_lists[i]->pins[j]);
593601
}
594602

595603
free_signal_list(signal_lists[i]);

ODIN_II/regression_test/benchmark/task/large/synthesis_result.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,18 @@
12321232
"Estimated LUTs": 209209,
12331233
"Total Node": 295165
12341234
},
1235+
"large/matmul_8x8_fp16/k6_frac_N10_frac_chain_mem32K_40nm": {
1236+
"test_name": "large/matmul_8x8_fp16/k6_frac_N10_frac_chain_mem32K_40nm",
1237+
"architecture": "k6_frac_N10_frac_chain_mem32K_40nm.xml",
1238+
"verilog": "matmul_8x8_fp16.v",
1239+
"exit": 134,
1240+
"errors": [
1241+
"matmul_8x8_fp16.v:1648:1 [AST] Can't find module name mac_fp"
1242+
],
1243+
"warnings": [
1244+
"matmul_8x8_fp16.v:1212:7 [AST] Odin does not handle signed REG (counter)"
1245+
]
1246+
},
12351247
"DEFAULT": {
12361248
"test_name": "n/a",
12371249
"architecture": "n/a",

ODIN_II/regression_test/benchmark/task/syntax/simulation_result.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,7 +1057,7 @@
10571057
"simulation_time(ms)": 216.7,
10581058
"test_coverage(%)": 100,
10591059
"Latch Drivers": 1,
1060-
"Pi": 35,
1060+
"Pi": 70,
10611061
"Po": 32,
10621062
"logic element": 32,
10631063
"latch": 32,
@@ -1076,7 +1076,7 @@
10761076
"simulation_time(ms)": 23,
10771077
"test_coverage(%)": 88.9,
10781078
"Latch Drivers": 1,
1079-
"Pi": 35,
1079+
"Pi": 70,
10801080
"Po": 32,
10811081
"logic element": 878,
10821082
"latch": 288,

ODIN_II/regression_test/benchmark/task/syntax/synthesis_result.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,7 +1289,7 @@
12891289
"exec_time(ms)": 61.1,
12901290
"synthesis_time(ms)": 15,
12911291
"Latch Drivers": 1,
1292-
"Pi": 35,
1292+
"Pi": 70,
12931293
"Po": 32,
12941294
"latch": 32,
12951295
"Adder": 0,
@@ -1307,7 +1307,7 @@
13071307
"exec_time(ms)": 23.6,
13081308
"synthesis_time(ms)": 22.2,
13091309
"Latch Drivers": 1,
1310-
"Pi": 35,
1310+
"Pi": 70,
13111311
"Po": 32,
13121312
"logic element": 846,
13131313
"latch": 288,

0 commit comments

Comments
 (0)