@@ -10,10 +10,13 @@ Author: Daniel Kroening, kroening@kroening.com
1010
1111#include < util/arith_tools.h>
1212#include < util/format_expr.h>
13+ #include < util/json_irep.h>
14+ #include < util/message.h>
1315#include < util/namespace.h>
1416#include < util/replace_expr.h>
1517#include < util/std_expr.h>
1618#include < util/std_types.h>
19+ #include < util/ui_message.h>
1720
1821#include < solvers/prop/prop.h>
1922
@@ -26,11 +29,17 @@ Author: Daniel Kroening, kroening@kroening.com
2629arrayst::arrayst (
2730 const namespacet &_ns,
2831 propt &_prop,
29- message_handlert &message_handler)
30- : equalityt(_prop, message_handler), ns(_ns)
32+ message_handlert &_message_handler,
33+ bool _get_array_constraints)
34+ : equalityt(_prop, _message_handler),
35+ ns(_ns),
36+ log(_message_handler),
37+ message_handler(_message_handler)
3138{
3239 lazy_arrays = false ; // will be set to true when --refine is used
3340 incremental_cache = false ; // for incremental solving
41+ // get_array_constraints is true when --show-array-constraints is used
42+ get_array_constraints = _get_array_constraints;
3443}
3544
3645void arrayst::record_array_index (const index_exprt &index)
@@ -365,6 +374,7 @@ void arrayst::add_array_Ackermann_constraints()
365374 lazy_constraintt lazy (lazy_typet::ARRAY_ACKERMANN,
366375 implies_exprt (literal_exprt (indices_equal_lit), values_equal));
367376 add_array_constraint (lazy, true ); // added lazily
377+ array_constraint_count[constraint_typet::ARRAY_ACKERMANN]++;
368378
369379#if 0 // old code for adding, not significantly faster
370380 prop.lcnf(!indices_equal_lit, convert(values_equal));
@@ -451,6 +461,7 @@ void arrayst::add_array_constraints_equality(
451461 // equality constraints are not added lazily
452462 // convert must be done to guarantee correct update of the index_set
453463 prop.lcnf (!array_equality.l , convert (equality_expr));
464+ array_constraint_count[constraint_typet::ARRAY_EQUALITY]++;
454465 }
455466}
456467
@@ -511,6 +522,7 @@ void arrayst::add_array_constraints(
511522 lazy_constraintt lazy (lazy_typet::ARRAY_TYPECAST,
512523 equal_exprt (index_expr1, index_expr2));
513524 add_array_constraint (lazy, false ); // added immediately
525+ array_constraint_count[constraint_typet::ARRAY_TYPECAST]++;
514526 }
515527 }
516528 else if (expr.id ()==ID_index)
@@ -549,6 +561,7 @@ void arrayst::add_array_constraints_with(
549561 lazy_constraintt lazy (
550562 lazy_typet::ARRAY_WITH, equal_exprt (index_expr, value));
551563 add_array_constraint (lazy, false ); // added immediately
564+ array_constraint_count[constraint_typet::ARRAY_WITH]++;
552565
553566 updated_indices.insert (index);
554567 }
@@ -582,7 +595,9 @@ void arrayst::add_array_constraints_with(
582595 // add constraint
583596 lazy_constraintt lazy (lazy_typet::ARRAY_WITH, or_exprt (equality_expr,
584597 literal_exprt (guard_lit)));
598+
585599 add_array_constraint (lazy, false ); // added immediately
600+ array_constraint_count[constraint_typet::ARRAY_WITH]++;
586601
587602#if 0 // old code for adding, not significantly faster
588603 {
@@ -678,6 +693,7 @@ void arrayst::add_array_constraints_array_of(
678693 lazy_constraintt lazy (
679694 lazy_typet::ARRAY_OF, equal_exprt (index_expr, expr.what ()));
680695 add_array_constraint (lazy, false ); // added immediately
696+ array_constraint_count[constraint_typet::ARRAY_OF]++;
681697 }
682698}
683699
@@ -713,6 +729,7 @@ void arrayst::add_array_constraints_array_constant(
713729 lazy_constraintt lazy{lazy_typet::ARRAY_CONSTANT,
714730 equal_exprt{index_expr, v}};
715731 add_array_constraint (lazy, false ); // added immediately
732+ array_constraint_count[constraint_typet::ARRAY_CONSTANT]++;
716733 }
717734 else
718735 {
@@ -755,6 +772,7 @@ void arrayst::add_array_constraints_array_constant(
755772 implies_exprt{index_constraint,
756773 equal_exprt{index_expr, operands[range.first ]}}};
757774 add_array_constraint (lazy, true ); // added lazily
775+ array_constraint_count[constraint_typet::ARRAY_CONSTANT]++;
758776 }
759777 }
760778 }
@@ -778,7 +796,9 @@ void arrayst::add_array_constraints_comprehension(
778796 lazy_constraintt lazy (
779797 lazy_typet::ARRAY_COMPREHENSION,
780798 equal_exprt (index_expr, comprehension_body));
799+
781800 add_array_constraint (lazy, false ); // added immediately
801+ array_constraint_count[constraint_typet::ARRAY_COMPREHENSION]++;
782802 }
783803}
784804
@@ -806,6 +826,7 @@ void arrayst::add_array_constraints_if(
806826 or_exprt (literal_exprt (!cond_lit),
807827 equal_exprt (index_expr1, index_expr2)));
808828 add_array_constraint (lazy, false ); // added immediately
829+ array_constraint_count[constraint_typet::ARRAY_IF]++;
809830
810831#if 0 // old code for adding, not significantly faster
811832 prop.lcnf(!cond_lit, convert(equal_exprt(index_expr1, index_expr2)));
@@ -825,9 +846,59 @@ void arrayst::add_array_constraints_if(
825846 or_exprt (literal_exprt (cond_lit),
826847 equal_exprt (index_expr1, index_expr2)));
827848 add_array_constraint (lazy, false ); // added immediately
849+ array_constraint_count[constraint_typet::ARRAY_IF]++;
828850
829851#if 0 // old code for adding, not significantly faster
830852 prop.lcnf(cond_lit, convert(equal_exprt(index_expr1, index_expr2)));
831853#endif
832854 }
833855}
856+
857+ std::string arrayst::enum_to_string (constraint_typet type)
858+ {
859+ switch (type)
860+ {
861+ case constraint_typet::ARRAY_ACKERMANN:
862+ return " arrayAckermann" ;
863+ case constraint_typet::ARRAY_WITH:
864+ return " arrayWith" ;
865+ case constraint_typet::ARRAY_IF:
866+ return " arrayIf" ;
867+ case constraint_typet::ARRAY_OF:
868+ return " arrayOf" ;
869+ case constraint_typet::ARRAY_TYPECAST:
870+ return " arrayTypecast" ;
871+ case constraint_typet::ARRAY_CONSTANT:
872+ return " arrayConstant" ;
873+ case constraint_typet::ARRAY_COMPREHENSION:
874+ return " arrayComprehension" ;
875+ case constraint_typet::ARRAY_EQUALITY:
876+ return " arrayEquality" ;
877+ default :
878+ UNREACHABLE;
879+ }
880+ }
881+
882+ void arrayst::display_array_constraint_count ()
883+ {
884+ json_objectt json_result;
885+ json_objectt &json_array_theory =
886+ json_result[" arrayConstraints" ].make_object ();
887+
888+ size_t num_constraints = 0 ;
889+
890+ array_constraint_countt::iterator it = array_constraint_count.begin ();
891+ while (it != array_constraint_count.end ())
892+ {
893+ std::string contraint_type_string = enum_to_string (it->first );
894+ json_array_theory[contraint_type_string] =
895+ json_numbert (std::to_string (it->second ));
896+
897+ num_constraints += it->second ;
898+ it++;
899+ }
900+
901+ json_result[" numOfConstraints" ] =
902+ json_numbert (std::to_string (num_constraints));
903+ log.status () << " ,\n " << json_result;
904+ }
0 commit comments