diff --git a/src/pel_stack/program_dag/program_dag.c b/src/pel_stack/program_dag/program_dag.c index e45da67..94a5a44 100644 --- a/src/pel_stack/program_dag/program_dag.c +++ b/src/pel_stack/program_dag/program_dag.c @@ -169,6 +169,7 @@ typedef enum { AMDUAT_PEL_PREP_ERROR_INPUT_ARITY, AMDUAT_PEL_PREP_ERROR_PARAM_DECODE, AMDUAT_PEL_PREP_ERROR_CYCLE, + AMDUAT_PEL_PREP_ERROR_NODE_OUTPUT_INDEX, AMDUAT_PEL_PREP_ERROR_ROOT_MISSING, AMDUAT_PEL_PREP_ERROR_ROOT_OUTPUT_INDEX } amduat_pel_program_prep_error_t; @@ -630,10 +631,19 @@ static amduat_pel_program_prepare_result_t amduat_program_prepare( } if (input->value.node.output_index >= prepared->ops[dep_index]->outputs_len) { + if (out_error != NULL) { + out_error->kind = AMDUAT_PEL_PREP_ERROR_NODE_OUTPUT_INDEX; + out_error->node_id = input->value.node.node_id; + out_error->index = input->value.node.output_index; + } amduat_prepared_free(prepared); return AMDUAT_PEL_PROGRAM_PREP_INVALID; } } else if (input->kind != AMDUAT_PEL_DAG_INPUT_EXTERNAL) { + if (out_error != NULL) { + out_error->kind = AMDUAT_PEL_PREP_ERROR_INVALID_INPUT_KIND; + out_error->node_id = node->id; + } amduat_prepared_free(prepared); return AMDUAT_PEL_PROGRAM_PREP_INVALID; } @@ -806,6 +816,13 @@ static bool amduat_pel_program_dag_exec_internal( AMDUAT_PEL_DAG_DIAG_CYCLE, "invalid program: dependency cycle"); break; + case AMDUAT_PEL_PREP_ERROR_NODE_OUTPUT_INDEX: + amduat_diag_setf(out_result, + AMDUAT_PEL_DAG_DIAG_OUTPUT_INDEX, + "invalid program: node %u output index %u out of range", + (unsigned int)prep_error.node_id, + (unsigned int)prep_error.index); + break; case AMDUAT_PEL_PREP_ERROR_ROOT_MISSING: amduat_diag_setf(out_result, AMDUAT_PEL_DAG_DIAG_MISSING_NODE,