diff --git a/include/amduat/pel/run.h b/include/amduat/pel/run.h index 61e120e..ce6c8cd 100644 --- a/include/amduat/pel/run.h +++ b/include/amduat/pel/run.h @@ -30,6 +30,16 @@ bool amduat_pel_surf_run_with_result(amduat_asl_store_t *store, amduat_reference_t params_ref, amduat_pel_run_result_t *out_run); +bool amduat_pel_exec_program_artifact_with_scheme( + amduat_reference_t scheme_ref, + amduat_artifact_t program_artifact, + const amduat_artifact_t *inputs, + size_t inputs_len, + const amduat_artifact_t *params, + amduat_artifact_t **out_outputs, + size_t *out_outputs_len, + amduat_pel_execution_result_value_t *out_result); + bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact, const amduat_artifact_t *inputs, size_t inputs_len, diff --git a/src/pel_stack/run.c b/src/pel_stack/run.c index f9dffa6..6b3024b 100644 --- a/src/pel_stack/run.c +++ b/src/pel_stack/run.c @@ -226,13 +226,14 @@ static bool amduat_pel_exec_program_bytes_unchecked( return ok; } -bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact, - const amduat_artifact_t *inputs, - size_t inputs_len, - const amduat_artifact_t *params, - amduat_artifact_t **out_outputs, - size_t *out_outputs_len, - amduat_pel_execution_result_value_t *out_result) { +static bool amduat_pel_exec_program_artifact_core( + amduat_artifact_t program_artifact, + const amduat_artifact_t *inputs, + size_t inputs_len, + const amduat_artifact_t *params, + amduat_artifact_t **out_outputs, + size_t *out_outputs_len, + amduat_pel_execution_result_value_t *out_result) { amduat_type_tag_t expected_type_tag; amduat_asl_encoding_profile_id_t expected_profile; @@ -272,3 +273,54 @@ bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact, out_outputs_len, out_result); } + +bool amduat_pel_exec_program_artifact_with_scheme( + amduat_reference_t scheme_ref, + amduat_artifact_t program_artifact, + const amduat_artifact_t *inputs, + size_t inputs_len, + const amduat_artifact_t *params, + amduat_artifact_t **out_outputs, + size_t *out_outputs_len, + amduat_pel_execution_result_value_t *out_result) { + if (out_outputs == NULL || out_outputs_len == NULL || out_result == NULL) { + return false; + } + memset(out_result, 0, sizeof(*out_result)); + + if (!amduat_reference_eq(scheme_ref, + amduat_pel_program_dag_scheme_ref())) { + out_result->pel1_version = 1; + out_result->status = AMDUAT_PEL_EXEC_STATUS_SCHEME_UNSUPPORTED; + out_result->scheme_ref = scheme_ref; + out_result->summary.kind = AMDUAT_PEL_EXEC_ERROR_SCHEME; + out_result->summary.status_code = 1; + *out_outputs = NULL; + *out_outputs_len = 0; + return true; + } + + return amduat_pel_exec_program_artifact_core(program_artifact, + inputs, + inputs_len, + params, + out_outputs, + out_outputs_len, + out_result); +} + +bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact, + const amduat_artifact_t *inputs, + size_t inputs_len, + const amduat_artifact_t *params, + amduat_artifact_t **out_outputs, + size_t *out_outputs_len, + amduat_pel_execution_result_value_t *out_result) { + return amduat_pel_exec_program_artifact_core(program_artifact, + inputs, + inputs_len, + params, + out_outputs, + out_outputs_len, + out_result); +} diff --git a/src/tools/amduat_pel_cli.c b/src/tools/amduat_pel_cli.c index 0946646..0e5180a 100644 --- a/src/tools/amduat_pel_cli.c +++ b/src/tools/amduat_pel_cli.c @@ -84,6 +84,7 @@ static void amduat_pel_cli_print_usage(FILE *stream) { "exec:\n" " amduat-pel exec --program PATH|-\n" " [--program-format raw|artifact]\n" + " [--scheme-ref REF|dag]\n" " [--input PATH ...] [--input-format raw|artifact]\n" " [--output-dir DIR] [--output-format raw|artifact]\n" " [--result-out PATH|-] [--format text|json]\n" @@ -665,6 +666,7 @@ static int amduat_pel_cli_cmd_exec(int argc, char **argv, const amduat_pel_cli_global_opts_t *global) { const char *program_path = NULL; + const char *scheme_ref_text = "dag"; const char **input_paths = NULL; size_t input_paths_len = 0; amduat_asl_io_format_t input_format = AMDUAT_ASL_IO_RAW; @@ -680,6 +682,7 @@ static int amduat_pel_cli_cmd_exec(int argc, amduat_pel_execution_result_value_t result; uint8_t *program_bytes = NULL; size_t program_len = 0; + amduat_reference_t scheme_ref; bool stdin_used = false; int exit_code = AMDUAT_PEL_CLI_EXIT_OK; FILE *out_stream = NULL; @@ -732,6 +735,12 @@ static int amduat_pel_cli_cmd_exec(int argc, return AMDUAT_PEL_CLI_EXIT_USAGE; } program_format_set = true; + } else if (strcmp(argv[i], "--scheme-ref") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "error: --scheme-ref requires a value\n"); + return AMDUAT_PEL_CLI_EXIT_USAGE; + } + scheme_ref_text = argv[++i]; } else if (strcmp(argv[i], "--output-dir") == 0) { if (i + 1 >= argc) { fprintf(stderr, "error: --output-dir requires a path\n"); @@ -792,11 +801,26 @@ static int amduat_pel_cli_cmd_exec(int argc, return AMDUAT_PEL_CLI_EXIT_IO; } + if (strcmp(scheme_ref_text, "dag") == 0) { + scheme_ref = amduat_pel_program_dag_scheme_ref(); + } else if (!amduat_pel_cli_ref_from_text(scheme_ref_text, + global->ref_format, + &stdin_used, + &scheme_ref)) { + fprintf(stderr, "error: invalid --scheme-ref\n"); + free(program_bytes); + free(input_paths); + return AMDUAT_PEL_CLI_EXIT_CODEC; + } + if (input_paths_len > 0) { inputs = (amduat_artifact_t *)calloc( input_paths_len, sizeof(*inputs)); if (inputs == NULL) { fprintf(stderr, "error: out of memory\n"); + if (strcmp(scheme_ref_text, "dag") != 0) { + amduat_pel_cli_free_reference(&scheme_ref); + } free(program_bytes); free(input_paths); return AMDUAT_PEL_CLI_EXIT_STORE; @@ -823,6 +847,9 @@ static int amduat_pel_cli_cmd_exec(int argc, &inputs[i])) { free(bytes); fprintf(stderr, "error: invalid input artifact\n"); + if (strcmp(scheme_ref_text, "dag") != 0) { + amduat_pel_cli_free_reference(&scheme_ref); + } free(program_bytes); program_bytes = NULL; exit_code = AMDUAT_PEL_CLI_EXIT_CODEC; @@ -845,20 +872,28 @@ static int amduat_pel_cli_cmd_exec(int argc, amduat_type_tag(0), &program_artifact)) { fprintf(stderr, "error: invalid program artifact\n"); + if (strcmp(scheme_ref_text, "dag") != 0) { + amduat_pel_cli_free_reference(&scheme_ref); + } free(program_bytes); program_bytes = NULL; exit_code = AMDUAT_PEL_CLI_EXIT_CODEC; goto exec_cleanup; } - if (!amduat_pel_exec_program_artifact(program_artifact, - inputs, - input_paths_len, - NULL, - &outputs, - &outputs_len, - &result)) { + if (!amduat_pel_exec_program_artifact_with_scheme( + scheme_ref, + program_artifact, + inputs, + input_paths_len, + NULL, + &outputs, + &outputs_len, + &result)) { amduat_asl_artifact_free(&program_artifact); fprintf(stderr, "error: exec failed\n"); + if (strcmp(scheme_ref_text, "dag") != 0) { + amduat_pel_cli_free_reference(&scheme_ref); + } free(program_bytes); program_bytes = NULL; exit_code = AMDUAT_PEL_CLI_EXIT_STORE; @@ -868,6 +903,9 @@ static int amduat_pel_cli_cmd_exec(int argc, } free(program_bytes); program_bytes = NULL; + if (strcmp(scheme_ref_text, "dag") != 0) { + amduat_pel_cli_free_reference(&scheme_ref); + } for (i = 0; i < (int)outputs_len; ++i) { char path_buf[4096]; @@ -988,6 +1026,9 @@ exec_cleanup: amduat_pel_program_dag_free_outputs(outputs, outputs_len); } amduat_pel_execution_result_free(&result); + if (strcmp(scheme_ref_text, "dag") != 0) { + amduat_pel_cli_free_reference(&scheme_ref); + } if (inputs != NULL) { for (i = 0; i < (int)input_paths_len; ++i) { amduat_asl_artifact_free(&inputs[i]);