aboutsummaryrefslogtreecommitdiff
path: root/chapters
diff options
context:
space:
mode:
authorDominic Symes <dominic.symes@arm.com>2023-07-20 14:26:38 +0100
committerDominic Symes <dominic.symes@arm.com>2023-07-24 15:08:48 +0000
commit7b0f1c9a090fb7e4c39afad5bdb09a2036b389a6 (patch)
tree9cd98838013c022bc009c2864147480702feea61 /chapters
parent67f6b26eab3da732cc05f26be3b5ef3b6fdbcf64 (diff)
downloadspecification-7b0f1c9a090fb7e4c39afad5bdb09a2036b389a6.tar.gz
COND_IF/WHILE_LOOP: Add nesting level limit
Nesting of if/while is bounded by MAX_NESTING, set accoring to the TOSA level. Change-Id: If9435a143ffa6bd7ba2e46a68542459b3d723b76 Signed-off-by: Dominic Symes <dominic.symes@arm.com>
Diffstat (limited to 'chapters')
-rw-r--r--chapters/control_flow.adoc6
-rw-r--r--chapters/introduction.adoc3
2 files changed, 8 insertions, 1 deletions
diff --git a/chapters/control_flow.adoc b/chapters/control_flow.adoc
index e43ef51..9de9c72 100644
--- a/chapters/control_flow.adoc
+++ b/chapters/control_flow.adoc
@@ -19,17 +19,20 @@ include::{generated}/operators/COND_IF.adoc[]
[source,c++]
----
+ERROR_IF(tosa_nesting_depth >= MAX_NESTING);
ERROR_IF(tensor_list_shape(input_list) != tosa_input_shape(then_graph));
ERROR_IF(tensor_list_shape(input_list) != tosa_input_shape(else_graph));
ERROR_IF(tensor_list_shape(output_list) != tosa_output_shape(then_graph));
ERROR_IF(tensor_list_shape(output_list) != tosa_output_shape(else_graph));
ERROR_IF(tensor_size(shape) != 1);
+tosa_nesting_depth++;
if (condition[0]) {
tosa_execute_graph(then_graph, input_list, output_list);
} else {
tosa_execute_graph(else_graph, input_list, output_list);
}
+tosa_nesting_depth--;
----
==== WHILE_LOOP
@@ -40,6 +43,7 @@ include::{generated}/operators/WHILE_LOOP.adoc[]
[source,c++]
----
+ERROR_IF(tosa_nesting_depth >= MAX_NESTING);
ERROR_IF(tensor_list_shape(input_list) != tosa_list_shape(output_list));
ERROR_IF(tensor_list_shape(input_list) != tosa_input_shape(cond_graph));
ERROR_IF(tensor_list_shape(input_list) != tosa_input_shape(body_graph));
@@ -54,11 +58,13 @@ int32_t i=0; // iteration number
tensor_list_t list[]; // array of tensor lists indexed by iteration
bool_t *condition[]; // array of condition tensors indexed by iteration
list[i] = input_list; // copy input data as list[0]
+tosa_nesting_depth++;
tosa_execute_graph(cond_graph, list[i], [ condition[i] ]); // initial condition
while (condition[i][0]) {
tosa_execute_graph(body_graph, list[i], list[i+1]);
i = i+1;
tosa_execute_graph(cond_graph, list[i], [ condition[i] ]);
}
+tosa_nesting_depth--;
output_list = list[i];
----
diff --git a/chapters/introduction.adoc b/chapters/introduction.adoc
index 955f310..62a9b2c 100644
--- a/chapters/introduction.adoc
+++ b/chapters/introduction.adoc
@@ -163,7 +163,8 @@ In terms of psuedo-code, if *graph* is a TOSA graph consisting of Baseline Infer
bool tosa_test_compliance(tosa_graph_t graph, tosa_list_t input_list, tosa_level_t level) {
shape_list_t output_list_spec = tosa_allocate_list(tosa_output_shape(graph));
shape_list_t output_list_test = tosa_allocate_list(tosa_output_shape(graph));
- tosa_graph_result = tosa_valid // result starts as valid
+ tosa_graph_result = tosa_valid; // result starts as valid
+ tosa_nesting_depth = 0; // if/while nesting level
tosa_execute_graph(graph, input_list, output_list_spec, level);
if (tosa_graph_result == tosa_unpredictable) {
return true; // No requirement to match an unpredictable result