@@ -433,6 +433,105 @@ ltl_sva_to_stringt::rec(const exprt &expr, modet mode)
433433 auto a2 = and_exprt{not_exprt{if_expr.cond ()}, if_expr.false_case ()};
434434 return rec (or_exprt{a1, a2}, mode);
435435 }
436+ else if (
437+ expr.id () ==
438+ ID_sva_sequence_repetition_star) // [*] or [*n] or [*x:y] or [*x:$]
439+ {
440+ PRECONDITION (mode == SVA_SEQUENCE);
441+ auto &repetition = to_sva_sequence_repetition_star_expr (expr);
442+ unary_exprt new_expr{ID_sva_sequence_repetition_star, repetition.op ()};
443+ if (!repetition.repetitions_given ())
444+ {
445+ return suffix (" [*]" , new_expr, mode);
446+ }
447+ else if (repetition.is_empty_match ())
448+ {
449+ throw ebmc_errort{} << " cannot convert [*0] to Buechi" ;
450+ }
451+ else if (repetition.is_singleton ())
452+ {
453+ auto n = numeric_cast_v<mp_integer>(repetition.repetitions ());
454+ return suffix (" [*" + integer2string (n) + " ]" , new_expr, mode);
455+ }
456+ else if (repetition.is_bounded_range ())
457+ {
458+ auto from = numeric_cast_v<mp_integer>(repetition.from ());
459+ auto to = numeric_cast_v<mp_integer>(repetition.to ());
460+ return suffix (
461+ " [*" + integer2string (from) + " .." + integer2string (to) + " ]" ,
462+ new_expr,
463+ mode);
464+ }
465+ else if (repetition.is_unbounded ())
466+ {
467+ auto from = numeric_cast_v<mp_integer>(repetition.from ());
468+ return suffix (" [*" + integer2string (from) + " ..]" , new_expr, mode);
469+ }
470+ else
471+ DATA_INVARIANT (false , " unexpected sva_sequence_repetition_star" );
472+ }
473+ else if (expr.id () == ID_sva_sequence_repetition_plus) // something[+]
474+ {
475+ PRECONDITION (mode == SVA_SEQUENCE);
476+ return suffix (" [+]" , expr, mode);
477+ }
478+ else if (expr.id () == ID_sva_sequence_goto_repetition) // something[->n]
479+ {
480+ PRECONDITION (mode == SVA_SEQUENCE);
481+ auto &repetition = to_sva_sequence_goto_repetition_expr (expr);
482+ unary_exprt new_expr{ID_sva_sequence_goto_repetition, repetition.op ()};
483+ if (repetition.is_singleton ())
484+ {
485+ auto n = numeric_cast_v<mp_integer>(repetition.repetitions ());
486+ return suffix (" [->" + integer2string (n) + " ]" , new_expr, mode);
487+ }
488+ else if (repetition.is_bounded_range ())
489+ {
490+ auto from = numeric_cast_v<mp_integer>(repetition.from ());
491+ auto to = numeric_cast_v<mp_integer>(repetition.to ());
492+ return suffix (
493+ " [->" + integer2string (from) + " .." + integer2string (to) + " ]" ,
494+ new_expr,
495+ mode);
496+ }
497+ else if (repetition.is_unbounded ())
498+ {
499+ auto from = numeric_cast_v<mp_integer>(repetition.from ());
500+ return suffix (" [->" + integer2string (from) + " ..]" , new_expr, mode);
501+ }
502+ else
503+ DATA_INVARIANT (false , " unexpected sva_sequence_goto_repetition" );
504+ }
505+ else if (
506+ expr.id () == ID_sva_sequence_non_consecutive_repetition) // something[=n]
507+ {
508+ PRECONDITION (mode == SVA_SEQUENCE);
509+ auto &repetition = to_sva_sequence_non_consecutive_repetition_expr (expr);
510+ unary_exprt new_expr{
511+ ID_sva_sequence_non_consecutive_repetition, repetition.op ()};
512+ if (repetition.is_singleton ())
513+ {
514+ auto n = numeric_cast_v<mp_integer>(repetition.repetitions ());
515+ return suffix (" [=" + integer2string (n) + " ]" , new_expr, mode);
516+ }
517+ else if (repetition.is_bounded_range ())
518+ {
519+ auto from = numeric_cast_v<mp_integer>(repetition.from ());
520+ auto to = numeric_cast_v<mp_integer>(repetition.to ());
521+ return suffix (
522+ " [=" + integer2string (from) + " .." + integer2string (to) + " ]" ,
523+ new_expr,
524+ mode);
525+ }
526+ else if (repetition.is_unbounded ())
527+ {
528+ auto from = numeric_cast_v<mp_integer>(repetition.from ());
529+ return suffix (" [=" + integer2string (from) + " ..]" , new_expr, mode);
530+ }
531+ else
532+ DATA_INVARIANT (
533+ false , " unexpected sva_sequence_non_consecutive_repetition" );
534+ }
436535 else if (!is_temporal_operator (expr))
437536 {
438537 auto number = atoms.number (expr);
0 commit comments