From ef3edc7762b5fd3636ff50cd4a3cd742975d8cf7 Mon Sep 17 00:00:00 2001 From: Carl Niklas Rydberg Date: Mon, 22 Dec 2025 07:03:36 +0100 Subject: [PATCH] Refine DAG structural diagnostics --- src/pel_stack/program_dag/program_dag.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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,