Skip to content

Commit

Permalink
Merge pull request #111 from MLanguage/mpp_functions_in_backend
Browse files Browse the repository at this point in the history
split mpp functions
  • Loading branch information
Raphaël Monat authored Feb 25, 2022
2 parents f0e8db8 + 8eb6ef2 commit 603531c
Show file tree
Hide file tree
Showing 32 changed files with 495 additions and 255 deletions.
12 changes: 8 additions & 4 deletions .github/workflows/check_correctness.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,19 @@ jobs:
run: |
eval $(opam env)
make test_c_backend
- name: Test Java backend
run: |
eval $(opam env)
make test_java_backend
- name: Test Python backend
run: |
eval $(opam env)
make test_python_backend
# Removed optimizations cause the python compiler to use too much memory,
# this option should be removed when that issue is fixed
- name: Test Java backend
run: |
eval $(opam env)
make test_java_backend
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ tests: build
$(MLANG) --run_all_tests=$(TESTS_DIR) $(SOURCE_FILES)

test_python_backend:
$(MAKE) -C examples/python/backend_tests all_tests
OPTIMIZE=1 $(MAKE) -C examples/python/backend_tests all_tests

test_c_backend_perf:
$(MAKE) -C examples/c/backend_tests run_perf
Expand Down
8 changes: 8 additions & 0 deletions Makefile.include
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,11 @@ else
endif

C_COMPILER?=clang

ifeq ($(OPTIMIZE), 1)
OPTIMIZE_FLAG=-O
else
OPTIMIZE_FLAG=
endif


2 changes: 0 additions & 2 deletions examples/c/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
include ../../Makefile.include

OPTIMIZE_FLAG=-O

MLANG_BIN=dune exec --no-print-director ../../src/main.exe --

MLANG_DEFAULT_OPTS=\
Expand Down
4 changes: 1 addition & 3 deletions examples/c/backend_tests/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
include ../../../Makefile.include

OPTIMIZE_FLAG=-O

MLANG_BIN=dune exec --no-print-director ../../../src/main.exe --

MLANG_DEFAULT_OPTS=\
Expand Down Expand Up @@ -43,7 +41,7 @@ ir_%.c: %.m_spec $(SOURCE_FILES)
CC=$(C_COMPILER)

ifeq ($(C_COMPILER), clang)
F_BRACKET_OPT=-fbracket-depth=2048
F_BRACKET_OPT=-fbracket-depth=3072
else
F_BRACKET_OPT=
endif
Expand Down
7 changes: 3 additions & 4 deletions examples/dgfip_c/Makefile
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
include ../../Makefile.include

MPP_FILE=../../mpp_specs/dgfip_base.mpp

OPTIMIZE_FLAG=-O
MPP_FILE=../../mpp_specs/2020_6_5.mpp

MLANG_BIN=dune exec --no-print-director ../../src/main.exe --

MLANG_DEFAULT_OPTS=\
--display_time --debug \
--mpp_file=$(MPP_FILE) \
--mpp_function=dgfip_calculation
--mpp_function=compute_double_liquidation_pvro

MLANG=$(MLANG_BIN) $(MLANG_DEFAULT_OPTS) $(OPTIMIZE_FLAG)

Expand All @@ -19,6 +17,7 @@ MLANG=$(MLANG_BIN) $(MLANG_DEFAULT_OPTS) $(OPTIMIZE_FLAG)

ir_%.c: ../../m_specs/%.m_spec $(SOURCE_FILES)
$(MLANG) \
--dgfip_options=-rXk4,-b0,-Ailiad\
--backend dgfip_c --output $@ \
$(SOURCE_FILES)

Expand Down
2 changes: 0 additions & 2 deletions examples/dgfip_c/backend_tests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ include ../../../Makefile.include

MPP_FILE=../../../mpp_specs/dgfip_base.mpp

OPTIMIZE_FLAG=-O

MLANG_BIN=dune exec --no-print-director ../../../src/main.exe --

MLANG_DEFAULT_OPTS=\
Expand Down
8 changes: 0 additions & 8 deletions examples/java/Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
include ../../Makefile.include

OPTIMIZE?=1

ifeq ($(OPTIMIZE), 1)
OPTIMIZE_FLAG=-O
else
OPTIMIZE_FLAG=
endif

MLANG_BIN=dune exec --no-print-director ../../src/main.exe --

MLANG_DEFAULT_OPTS=\
Expand Down
7 changes: 0 additions & 7 deletions examples/python/Makefile
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
include ../../Makefile.include

ifeq ($(OPTIMIZE), 1)
OPTIMIZE_FLAG=-O
else
OPTIMIZE_FLAG=
endif

MLANG_BIN=dune exec --no-print-director ../../src/main.exe --

MLANG_DEFAULT_OPTS=\
Expand All @@ -23,7 +17,6 @@ ir_%.py: ../../m_specs/%.m_spec
$(MLANG) \
--backend python --output $@ \
--function_spec $^ \
--optimize \
$(SOURCE_FILES)

run_%.py: ir_%.py FORCE
Expand Down
3 changes: 2 additions & 1 deletion examples/python/backend_tests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ MLANG=dune exec ../../../src/main.exe --

all_tests:
python3 gen_m_spec.py $(TESTS_DIR) tests.m_spec all_ins.csv
$(MLANG) --display_time --debug --optimize \
$(MLANG) --display_time --debug \
$(OPTIMIZE_FLAG) \
--mpp_file $(MPP_FILE) --mpp_function compute_double_liquidation_pvro \
--backend python --output ./tests.py \
--function_spec ./tests.m_spec \
Expand Down
17 changes: 13 additions & 4 deletions mpp_specs/2020_6_5.mpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,21 @@ compute_article1731bis():
ART1731BIS = 1
PREM8_11 = 1

calcul_primitif_isf(outputs):
outputs <- call_m(calcul_primitif_isf)

calcul_primitif(outputs):
outputs <- call_m(calcul_primitif)

calcul_primitif_taux(outputs):
outputs <- call_m(calcul_primitif_taux)

compute_benefits():
if exists_deposit_defined_variables() or exists_taxbenefit_ceiled_variables():
partition with var_is_taxbenefit:
V_INDTEO = 1
V_CALCUL_NAPS = 1
IAD11, INE, IRE <- call_m(calcul_primitif)
IAD11, INE, IRE <- calcul_primitif()
V_CALCUL_NAPS = 0
iad11 = cast(IAD11)
ire = cast(IRE)
Expand Down Expand Up @@ -41,9 +50,9 @@ compute_double_liquidation3(outputs):
8ZG = v_8ZG
V_ACO_MTAP = 0
V_NEGACO = 0
outputs <- call_m(calcul_primitif_isf)
outputs <- call_m(calcul_primitif)
outputs <- call_m(calcul_primitif_taux)
outputs <- calcul_primitif_isf()
outputs <- calcul_primitif()
outputs <- calcul_primitif_taux()

compute_double_liquidation_exit_taxe(outputs):
annee = 2018 # FIXME
Expand Down
56 changes: 40 additions & 16 deletions src/mlang/backend_compilers/bir_to_c.ml
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,8 @@ let rec generate_stmt (program : Bir.program)
| SRuleCall r ->
let rule = Bir.RuleMap.find r program.rules in
generate_rule_function_header ~definition:false oc rule
| SFunctionCall (f, _) ->
Format.fprintf oc "if(%s(output, TGV, LOCAL)) {return -1;};\n" f

and generate_stmts (program : Bir.program) (var_indexes : int Mir.VariableMap.t)
(oc : Format.formatter) (stmts : Bir.stmt list) =
Expand Down Expand Up @@ -285,6 +287,25 @@ let generate_rule_functions (program : Bir.program)
oc
(Bir.RuleMap.bindings rules |> List.map snd)

let generate_mpp_function (program : Bir.program)
(var_indexes : int Mir.VariableMap.t) (oc : Format.formatter)
(f : Bir.function_name) =
let stmts = Bir.FunctionMap.find f program.mpp_functions in
Format.fprintf oc
"@[<hv 4>int %s(m_output*output, m_value* TGV, m_value* LOCAL) {@,\
m_value cond;@,\
%a@,\
return 0;@]}@,"
f
(generate_stmts program var_indexes)
stmts

let generate_mpp_functions (program : Bir.program) (oc : Format.formatter)
(var_indexes : int Mir.VariableMap.t) =
Bir.FunctionMap.iter
(fun fname _ -> generate_mpp_function program var_indexes oc fname)
(Bir_interface.context_agnostic_mpp_functions program)

let generate_main_function_signature (oc : Format.formatter)
(add_semicolon : bool) =
Format.fprintf oc "int m_extracted(m_output *output, const m_input *input)%s"
Expand Down Expand Up @@ -612,22 +633,25 @@ let generate_c_program (program : Bir.program)
close_out _oc;
let _oc = open_out filename in
let oc = Format.formatter_of_out_channel _oc in
Format.fprintf oc "%a%a%a%a%a%a%a%a%a%a%a%a%a%a%a" generate_implem_header
header_filename generate_empty_input_func function_spec
generate_input_from_array_func function_spec generate_get_input_index_func
function_spec generate_get_input_name_from_index_func function_spec
generate_get_input_num_func function_spec generate_output_to_array_func
function_spec generate_get_output_index_func function_spec
Format.fprintf oc "%a%a%a%a%a%a%a%a%a%a%a%a%a%a%a%a"
generate_implem_header header_filename
generate_empty_input_func function_spec
generate_input_from_array_func function_spec
generate_get_input_index_func function_spec
generate_get_input_name_from_index_func function_spec
generate_get_input_num_func function_spec
generate_output_to_array_func function_spec
generate_get_output_index_func function_spec
generate_get_output_name_from_index_func function_spec
generate_get_output_num_func function_spec generate_empty_output_func
function_spec
generate_get_output_num_func function_spec
generate_empty_output_func function_spec
(generate_rule_functions program var_indexes)
program.rules
program.rules
(generate_mpp_functions program)
var_indexes
(generate_main_function_signature_and_var_decls program var_indexes
var_table_size)
function_spec
(generate_stmts program var_indexes)
program.statements
(generate_return var_indexes)
function_spec;
close_out _oc
var_table_size) function_spec
(generate_stmts program var_indexes)
(Bir.main_statements program)
(generate_return var_indexes) function_spec;
close_out _oc[@@ocamlformat "disable"]
65 changes: 54 additions & 11 deletions src/mlang/backend_compilers/bir_to_dgfip_c.ml
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ let rec generate_stmt (program : Bir.program)
| SRuleCall r ->
let rule = Bir.RuleMap.find r program.rules in
generate_rule_function_header ~definition:false oc rule
| SFunctionCall (f, _) -> Format.fprintf oc "%s(irdata);\n" f

and generate_stmts (program : Bir.program)
(var_indexes : Dgfip_varid.var_id_map) (oc : Format.formatter)
Expand Down Expand Up @@ -509,6 +510,38 @@ let generate_get_error_count_func (oc : Format.formatter)
generate_get_error_count_prototype false
(VariableMap.cardinal program.mir_program.program_conds)

let generate_mpp_function_protoype (add_semicolon : bool)
(oc : Format.formatter) (function_name : Bir.function_name) =
Format.fprintf oc "int %s(T_irdata* irdata)%s" function_name
(if add_semicolon then ";" else "")

let generate_mpp_function (program : Bir.program)
(var_indexes : Dgfip_varid.var_id_map) (oc : Format.formatter)
(f : Bir.function_name) =
let stmts = Bir.FunctionMap.find f program.mpp_functions in
Format.fprintf oc "@[<hv 4>%a{@,m_value cond;@,%a@]}@,"
(generate_mpp_function_protoype false)
f
(generate_stmts program var_indexes)
stmts

let generate_mpp_functions (program : Bir.program) (oc : Format.formatter)
(var_indexes : Dgfip_varid.var_id_map) =
List.iter
(fun (fname, _) -> generate_mpp_function program var_indexes oc fname)
(Bir.FunctionMap.bindings program.mpp_functions)

let generate_mpp_functions_signatures (oc : Format.formatter)
(program : Bir.program) =
let funcs, _ =
List.split
(Bir.FunctionMap.bindings
(Bir_interface.context_agnostic_mpp_functions program))
in
Format.fprintf oc "@[<v 0>%a@]@,"
(Format.pp_print_list (generate_mpp_function_protoype true))
funcs

let generate_implem_header oc header_filename =
Format.fprintf oc "// File generated by the Mlang compiler\n\n";
Format.fprintf oc "#include \"%s\"\n\n" header_filename;
Expand All @@ -524,25 +557,35 @@ let generate_c_program (program : Bir.program)
let header_filename = Filename.remove_extension filename ^ ".h" in
let _oc = open_out header_filename in
let oc = Format.formatter_of_out_channel _oc in
Format.fprintf oc "%a%a%a%a%a%a%a%a%a%a%a" generate_header ()
error_table_definitions program generate_get_input_index_prototype true
Format.fprintf oc "%a%a%a%a%a%a%a%a%a%a%a%a"
generate_header ()
error_table_definitions program
generate_get_input_index_prototype true
generate_get_input_num_prototype true
generate_get_input_name_from_index_prototype true
generate_get_output_index_prototype true
generate_get_output_name_from_index_prototype true
generate_get_output_num_prototype true generate_get_error_count_prototype
true generate_main_function_signature true generate_footer ();
generate_get_output_num_prototype true
generate_get_error_count_prototype true
generate_mpp_functions_signatures program
generate_main_function_signature true
generate_footer ();
close_out _oc;
let _oc = open_out filename in
let oc = Format.formatter_of_out_channel _oc in
Format.fprintf oc "%a%a%a%a%a%a%a%a%a%a%a" generate_implem_header
header_filename generate_errors_table program generate_get_error_count_func
program generate_get_input_num_func function_spec
Format.fprintf oc "%a%a%a%a%a%a%a%a%a%a%a%a"
generate_implem_header header_filename
generate_errors_table program
generate_get_error_count_func program
generate_get_input_num_func function_spec
generate_get_output_index_func function_spec
generate_get_output_name_from_index_func function_spec
generate_get_output_num_func function_spec
(generate_rule_functions program vm)
program.rules generate_main_function_signature_and_var_decls ()
(generate_stmts program vm)
program.statements generate_return ();
close_out _oc
program.rules
(generate_mpp_functions program) vm
generate_main_function_signature_and_var_decls ()
(generate_stmt program vm)
(Bir.SFunctionCall (program.Bir.main_function, []), Pos.no_pos)
generate_return ();
close_out _oc[@@ocamlformat "disable"]
Loading

0 comments on commit 603531c

Please sign in to comment.