vericert.hls.PipelineOp







Definition div_pos (il: nat * list nat) x :=
  let (i, l) := il in
  match x with
  | RBop _ Odiv _ _ => (S i, i :: l)
  | RBop _ Odivu _ _ => (S i, i :: l)
  | RBop _ Omod _ _ => (S i, i :: l)
  | RBop _ Omodu _ _ => (S i, i :: l)
  | _ => (S i, l)
  end.

Definition div_pos_in_list (il: nat * list (nat * nat)) bb :=
  let (i, l) := il in
  let dp := snd (List.fold_left div_pos bb (0%nat, nil)) in
  (S i, (List.map (fun x => (i, x)) dp) ++ l).

Definition div_pos_in_block (il: nat * list (nat * nat * nat)) bb :=
  let (i, l) := il in
  let dp := snd (List.fold_left div_pos_in_list bb (0%nat, nil)) in
  (S i, (List.map (fun (yx : nat * nat) => let (y, x) := yx in (i, y, x)) dp) ++ l).

Definition find_divs (bb: bblock) :=
  snd (List.fold_left div_pos_in_block bb.(bb_body) (0%nat, nil)).

Fixpoint mapi' {A B: Type} (n: nat) (f: nat -> A -> B) (l: list A): list B :=
  match l with
  | nil => nil
  | a :: b => f n a :: mapi' (S n) f b
  end.

Definition mapi {A B: Type} := @mapi' A B 0.

Definition map_at {A: Type} (n: nat) (f: A -> A) (l: list A): list A :=
  mapi (fun i il =>
          if Nat.eqb n i
          then f il
          else il
       ) l.

Definition map_at_err {A: Type} (n: nat) (f: A -> A) (l: list A): option (list A) :=
  if (Datatypes.length l <=? n)%nat
  then None
  else Some (map_at n f l).