diff --git a/src/Init/Data/BitVec/Bitblast.lean b/src/Init/Data/BitVec/Bitblast.lean index 003d35aa2c..2b2567224c 100644 --- a/src/Init/Data/BitVec/Bitblast.lean +++ b/src/Init/Data/BitVec/Bitblast.lean @@ -1230,4 +1230,33 @@ theorem shiftRight_eq_ushiftRightRec (x : BitVec w₁) (y : BitVec w₂) : · simp [of_length_zero] · simp [ushiftRightRec_eq] +/- ### umod -/ + +theorem getElem_umod {n d : BitVec w} (hi : i < w) : + (n % d)[i] + = if d = 0#w then n[i] + else (divRec w { n := n, d := d } (DivModState.init w)).r[i] := by + by_cases hd : d = 0#w + · simp [hd] + · have := (BitVec.not_le (x := d) (y := 0#w)).mp + rw [← BitVec.umod_eq_divRec (by simp [hd, this])] + simp [hd] + +theorem getLsbD_umod {n d : BitVec w}: + (n % d).getLsbD i + = if d = 0#w then n.getLsbD i + else (divRec w { n := n, d := d } (DivModState.init w)).r.getLsbD i := by + by_cases hi : i < w + · simp only [BitVec.getLsbD_eq_getElem hi, getElem_umod] + · simp [show w ≤ i by omega] + +theorem getMsbD_umod {n d : BitVec w}: + (n % d).getMsbD i + = if d = 0#w then n.getMsbD i + else (divRec w { n := n, d := d } (DivModState.init w)).r.getMsbD i := by + by_cases hi : i < w + · rw [BitVec.getMsbD_eq_getLsbD, getLsbD_umod] + simp [BitVec.getMsbD_eq_getLsbD, hi] + · simp [show w ≤ i by omega] + end BitVec