Refine DAG structural diagnostics

This commit is contained in:
Carl Niklas Rydberg 2025-12-22 07:03:36 +01:00
parent ef2fd955f1
commit ef3edc7762

View file

@ -169,6 +169,7 @@ typedef enum {
AMDUAT_PEL_PREP_ERROR_INPUT_ARITY, AMDUAT_PEL_PREP_ERROR_INPUT_ARITY,
AMDUAT_PEL_PREP_ERROR_PARAM_DECODE, AMDUAT_PEL_PREP_ERROR_PARAM_DECODE,
AMDUAT_PEL_PREP_ERROR_CYCLE, AMDUAT_PEL_PREP_ERROR_CYCLE,
AMDUAT_PEL_PREP_ERROR_NODE_OUTPUT_INDEX,
AMDUAT_PEL_PREP_ERROR_ROOT_MISSING, AMDUAT_PEL_PREP_ERROR_ROOT_MISSING,
AMDUAT_PEL_PREP_ERROR_ROOT_OUTPUT_INDEX AMDUAT_PEL_PREP_ERROR_ROOT_OUTPUT_INDEX
} amduat_pel_program_prep_error_t; } 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 >= if (input->value.node.output_index >=
prepared->ops[dep_index]->outputs_len) { 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); amduat_prepared_free(prepared);
return AMDUAT_PEL_PROGRAM_PREP_INVALID; return AMDUAT_PEL_PROGRAM_PREP_INVALID;
} }
} else if (input->kind != AMDUAT_PEL_DAG_INPUT_EXTERNAL) { } 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); amduat_prepared_free(prepared);
return AMDUAT_PEL_PROGRAM_PREP_INVALID; return AMDUAT_PEL_PROGRAM_PREP_INVALID;
} }
@ -806,6 +816,13 @@ static bool amduat_pel_program_dag_exec_internal(
AMDUAT_PEL_DAG_DIAG_CYCLE, AMDUAT_PEL_DAG_DIAG_CYCLE,
"invalid program: dependency cycle"); "invalid program: dependency cycle");
break; 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: case AMDUAT_PEL_PREP_ERROR_ROOT_MISSING:
amduat_diag_setf(out_result, amduat_diag_setf(out_result,
AMDUAT_PEL_DAG_DIAG_MISSING_NODE, AMDUAT_PEL_DAG_DIAG_MISSING_NODE,