From 6d2be99c63f7ec70b0100d942372d127883a9022 Mon Sep 17 00:00:00 2001 From: Erik Stenman Date: Thu, 7 Mar 2019 11:09:04 +0100 Subject: [PATCH 1/3] Generate docs. --- src/aeb_fate_generate_ops.erl | 50 +++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/aeb_fate_generate_ops.erl b/src/aeb_fate_generate_ops.erl index 3b77417..6c29b40 100644 --- a/src/aeb_fate_generate_ops.erl +++ b/src/aeb_fate_generate_ops.erl @@ -2,6 +2,7 @@ -export([ gen_and_halt/1 , generate/0 + , generate_documentation/1 , test_asm_generator/1]). gen_and_halt([SrcDirArg, IncludeDirArg]) -> @@ -635,3 +636,52 @@ gen_variant() -> 2 -> "(| 2 | 1 | ( " ++ imm_arg() ++ " ) |)"; 3 -> "(| 2 | 0 | ( " ++ imm_arg() ++ ", " ++ imm_arg() ++ " ) |)" end. + + +%% TODO: add gas cost. +generate_documentation(Filename) -> + {ok, File} = file:open(Filename, [write]), + Instructions = lists:flatten([gen_doc(Op)++"\n" || Op <- gen(ops_defs())]), + io:format(File, + "### Operations\n\n" + "| OpCode | Name | Args | Description |\n" + "| --- | --- | --- | --- |\n" + "~s" + , [Instructions]), + io:format(File, "\n", []), + file:close(File). + +gen_doc(#{ opname := Name + , opcode := OpCode + , args := Args + , end_bb := EndBB + , format := FateFormat + , macro := Macro + , type_name := TypeName + , doc := Doc + , gas := Gas + , type := Type + , constructor := Constructor + , constructor_type := ConstructorType + }) -> + Arguments = + case FateFormat of + atomic -> ""; + _ -> lists:join(" ", + [format_arg_doc(A) || + A <- + lists:zip(FateFormat, + lists:seq(0,length(FateFormat)-1))]) + end, + io_lib:format("| 0x~.16b | ~w | ~s | ~s |\n", + [ OpCode + , Name + , Arguments + , Doc]). + +format_arg_doc({a, N}) -> io_lib:format("Arg~w", [N]); +format_arg_doc({is,N}) -> "Identifier"; +format_arg_doc({ii,N}) -> "Integer"; +format_arg_doc({li,N}) -> "[Integers]"; +format_arg_doc({t,N}) -> "Type". + -- 2.30.2 From f2930ae1694346b788674182b8d309d2abc0bc5b Mon Sep 17 00:00:00 2001 From: Erik Stenman Date: Thu, 7 Mar 2019 11:10:25 +0100 Subject: [PATCH 2/3] Test lists of length 16. --- test/aeb_serialize_test.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/aeb_serialize_test.erl b/test/aeb_serialize_test.erl index dcbe4e2..778a2f9 100644 --- a/test/aeb_serialize_test.erl +++ b/test/aeb_serialize_test.erl @@ -61,6 +61,7 @@ sources() -> "0123456789012345678901234567890123456789">>), %% Magic concat 80 char string. aeb_fate_data:make_tuple({True, FortyTwo}), aeb_fate_data:make_tuple(list_to_tuple(make_int_list(65))), + aeb_fate_data:make_tuple(list_to_tuple(make_int_list(16))), aeb_fate_data:make_map(#{ aeb_fate_data:make_integer(1) => True, aeb_fate_data:make_integer(2) => False}), aeb_fate_data:make_map(#{ aeb_fate_data:make_string(<<"foo">>) => aeb_fate_data:make_tuple({FortyTwo, True})}), aeb_fate_data:make_list(make_int_list(3)), -- 2.30.2 From 2b5478288cd3d9a355fe703acc2937434085e2b2 Mon Sep 17 00:00:00 2001 From: Erik Stenman Date: Thu, 7 Mar 2019 12:36:53 +0100 Subject: [PATCH 3/3] Export ops definitions. --- src/aeb_fate_generate_ops.erl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/aeb_fate_generate_ops.erl b/src/aeb_fate_generate_ops.erl index 6c29b40..f5bb14f 100644 --- a/src/aeb_fate_generate_ops.erl +++ b/src/aeb_fate_generate_ops.erl @@ -3,6 +3,7 @@ -export([ gen_and_halt/1 , generate/0 , generate_documentation/1 + , get_ops/0 , test_asm_generator/1]). gen_and_halt([SrcDirArg, IncludeDirArg]) -> @@ -10,11 +11,12 @@ gen_and_halt([SrcDirArg, IncludeDirArg]) -> atom_to_list(IncludeDirArg)), halt(). -generate() -> - generate("src/", "include/"). +generate() -> generate("src/", "include/"). + +get_ops() -> gen(ops_defs()). generate(Src, Include) -> - Ops = gen(ops_defs()), + Ops = get_ops(), %% io:format("ops: ~p\n", [Ops]), HrlFile = Include ++ "aeb_fate_opcodes.hrl", generate_header_file(HrlFile, Ops), @@ -519,7 +521,7 @@ gen_format(#{opname := Name, format := Args}) -> test_asm_generator(Filename) -> {ok, File} = file:open(Filename, [write]), - Instructions = lists:flatten([gen_instruction(Op)++"\n" || Op <- gen(ops_defs())]), + Instructions = lists:flatten([gen_instruction(Op)++"\n" || Op <- get_ops()]), io:format(File, ";; CONTRACT all_instructions\n\n" ";; Dont expect this contract to typecheck or run.\n" @@ -641,7 +643,7 @@ gen_variant() -> %% TODO: add gas cost. generate_documentation(Filename) -> {ok, File} = file:open(Filename, [write]), - Instructions = lists:flatten([gen_doc(Op)++"\n" || Op <- gen(ops_defs())]), + Instructions = lists:flatten([gen_doc(Op)++"\n" || Op <- get_ops()]), io:format(File, "### Operations\n\n" "| OpCode | Name | Args | Description |\n" -- 2.30.2