
Module: ppl/ppl Branch: master Commit: 2c22a25b340549e57e511f8961204ed546da541a URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=2c22a25b34054...
Author: Patricia Hill p.m.hill@leeds.ac.uk Date: Tue Mar 23 11:08:20 2010 +0000
Added interface code for wrap_assign().
---
.../OCaml/ppl_interface_generator_ocaml_cc_code.m4 | 44 ++++++++++++++++- .../OCaml/ppl_interface_generator_ocaml_ml_code.m4 | 13 +++++ .../ppl_interface_generator_ocaml_mli_code.m4 | 9 +++ ...terface_generator_ocaml_procedure_generators.m4 | 1 + interfaces/OCaml/ppl_ocaml_common.cc | 53 ++++++++++++++++++++ interfaces/OCaml/ppl_ocaml_common.defs.hh | 9 +++ interfaces/OCaml/ppl_ocaml_globals.ml | 13 +++++ interfaces/OCaml/ppl_ocaml_globals.mli | 13 +++++ 8 files changed, 154 insertions(+), 1 deletions(-)
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 index 3900367..5ec23cd 100644 --- a/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 @@ -625,7 +625,6 @@ CATCH_ALL
')
- m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', `dnl extern "C" @@ -1325,3 +1324,46 @@ CAMLprim value CATCH_ALL
') + +m4_define(`ppl_@CLASS@_wrap_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_wrap_assign_native + (value ph, value caml_vset, value width, value rep, value oflow, + value cs, value complexity, value wrap_ind) try { + CAMLparam5(ph, caml_vset, width, rep, oflow); + CAMLxparam3(cs, complexity, wrap_ind); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + Variables_Set ppl_vset; + if (Int_val(caml_vset) == 0) + CAMLreturn(Val_unit); + while (true) { + ppl_vset.insert(Int_val(Field(caml_vset, 0))); + if (Int_val(Field(caml_vset, 1)) == 0) + break; + caml_vset = Field(caml_vset, 1); + } + build_ppl_bounded_integer_type_representation(rep); + build_ppl_bounded_integer_type_overflow(oflow); + Constraint_System ppl_cs = build_ppl_Constraint_System(cs); + unsigned ppl_complexity = value_to_unsigned<unsigned>(complexity); + bool ppl_wrap_ind = Int_val(wrap_ind); + pph.wrap_assign(ppl_vset, + build_ppl_bounded_integer_type_width(width), + build_ppl_bounded_integer_type_representation(rep), + build_ppl_bounded_integer_type_overflow(oflow), + &ppl_cs, ppl_complexity, ppl_wrap_ind); + CAMLreturn(Val_unit); +} +CATCH_ALL + +CAMLprim value +ppl_@CLASS@_wrap_assign_bytecode(value * argv, int) +{ + return ppl_@CLASS@_wrap_assign_native(argv[0], argv[1], argv[2], argv[3], + argv[4], argv[5], argv[6], argv[7]); +} + +') + diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 index 0642842..aa3fd70 100644 --- a/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 @@ -593,3 +593,16 @@ external ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2: = "ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2"
') + +m4_define(`ppl_@CLASS@_wrap_assign_code', +`dnl +external ppl_@CLASS@_wrap_assign: @!CLASS@ + -> bounded_integer_type_width + -> bounded_integer_type_representation + -> bounded_integer_type_overflow + -> constraint_system + -> int list -> int -> int -> unit + = "ppl_@CLASS@_wrap_assign_bytecode" + "ppl_@CLASS@_wrap_assign_native" + +') diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 index acb05a4..6f6125a 100644 --- a/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 @@ -515,3 +515,12 @@ val ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2: @!CLASS@ -> @!CLASS@ -> polyhedron
') + +val ppl_@CLASS@_wrap_assign: @!CLASS@ + -> bounded_integer_type_width + -> bounded_integer_type_representation + -> bounded_integer_type_overflow + -> constraint_system + -> int list -> int -> int -> unit + +') diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 index 8b8ff38..fad79c8 100644 --- a/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 @@ -43,6 +43,7 @@ dnl m4_define(`m4_procedure_list', `m4_echo_unquoted(ppl_new_@CLASS@_iterator +pointset_powerset, `m4_common_procedure_list', +ppl_@CLASS@_wrap_assign +simple, ppl_termination_test_@TERMINATION_ID@_@TOPOLOGY@@CLASS@ +simple, ppl_one_affine_ranking_function_@TERMINATION_ID@_@TOPOLOGY@@CLASS@ +simple, ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@ +simple, diff --git a/interfaces/OCaml/ppl_ocaml_common.cc b/interfaces/OCaml/ppl_ocaml_common.cc index 8592046..ca1a1ef 100644 --- a/interfaces/OCaml/ppl_ocaml_common.cc +++ b/interfaces/OCaml/ppl_ocaml_common.cc @@ -209,6 +209,59 @@ build_ppl_relsym(value caml_relsym) { } }
+Bounded_Integer_Type_Width +build_ppl_bounded_integer_type_width(value caml_width) { + assert(Is_long(caml_width)); + switch (Int_val(caml_width)) { + case 0: + return BITS_8; + case 1: + return BITS_16; + case 2: + return BITS_32; + case 3: + return BITS_64; + case 4: + return BITS_128; + default: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error\n:" + "build_ppl_bounded_integer_type_width(width)"); + } +} + +Bounded_Integer_Type_Representation +build_ppl_bounded_integer_type_representation(value caml_rep) { + assert(Is_long(caml_rep)); + switch (Int_val(caml_rep)) { + case 0: + return UNSIGNED; + case 1: + return SIGNED_2_COMPLEMENT; + default: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error\n:" + "build_ppl_bounded_integer_type_representation(rep)"); + } +} + +Bounded_Integer_Type_Overflow +build_ppl_bounded_integer_type_overflow(value caml_oflow) { + assert(Is_long(caml_oflow)); + switch (Int_val(caml_oflow)) { + case 0: + return OVERFLOW_WRAPS; + case 1: + return OVERFLOW_UNDEFINED; + case 2: + return OVERFLOW_IMPOSSIBLE; + default: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error\n:" + "build_ppl_bounded_integer_type_overflow(oflow)"); + } +} + Optimization_Mode build_ppl_opt_mode(value caml_opt_mode) { assert(Is_long(caml_opt_mode)); diff --git a/interfaces/OCaml/ppl_ocaml_common.defs.hh b/interfaces/OCaml/ppl_ocaml_common.defs.hh index 21e64f9..ee31a6f 100644 --- a/interfaces/OCaml/ppl_ocaml_common.defs.hh +++ b/interfaces/OCaml/ppl_ocaml_common.defs.hh @@ -71,6 +71,15 @@ build_ppl_Complexity_Class(value cc); Relation_Symbol build_ppl_relsym(value caml_relsym);
+Bounded_Integer_Type_Overflow +build_ppl_bounded_integer_type_overflow(value caml_oflow); + +Bounded_Integer_Type_Representation +build_ppl_bounded_integer_type_representation(value caml_rep); + +Bounded_Integer_Type_Width +build_ppl_bounded_integer_type_width(value caml_width); + Coefficient build_ppl_Coefficient(value coeff);
diff --git a/interfaces/OCaml/ppl_ocaml_globals.ml b/interfaces/OCaml/ppl_ocaml_globals.ml index cd263d5..9868e7b 100644 --- a/interfaces/OCaml/ppl_ocaml_globals.ml +++ b/interfaces/OCaml/ppl_ocaml_globals.ml @@ -102,6 +102,19 @@ type congruence_system = linear_congruence list type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS | Greater_Than_RS | Greater_Or_Equal_RS
+type bounded_integer_type_overflow = Overflow_Wraps + | Overflow_Undefined + | Overflow_Impossible + +type bounded_integer_type_representation = Unsigned + | Signed_2_Complement + +type bounded_integer_type_width = Bits_8 + | Bits_16 + | Bits_32 + | Bits_64 + | Bits_128 + type complexity_class = Polynomial_Complexity | Simplex_Complexity | Any_Complexity diff --git a/interfaces/OCaml/ppl_ocaml_globals.mli b/interfaces/OCaml/ppl_ocaml_globals.mli index f806f0d..e0d9c69 100644 --- a/interfaces/OCaml/ppl_ocaml_globals.mli +++ b/interfaces/OCaml/ppl_ocaml_globals.mli @@ -88,6 +88,19 @@ type congruence_system = linear_congruence list type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS | Greater_Than_RS | Greater_Or_Equal_RS
+type bounded_integer_type_overflow = Overflow_Wraps + | Overflow_Undefined + | Overflow_Impossible + +type bounded_integer_type_representation = Unsigned + | Signed_2_Complement + +type bounded_integer_type_width = Bits_8 + | Bits_16 + | Bits_32 + | Bits_64 + | Bits_128 + type complexity_class = Polynomial_Complexity | Simplex_Complexity | Any_Complexity