aboutsummaryrefslogtreecommitdiff
path: root/src/Compilers/Z/Bounds/Interpretation.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compilers/Z/Bounds/Interpretation.v')
-rw-r--r--src/Compilers/Z/Bounds/Interpretation.v289
1 files changed, 0 insertions, 289 deletions
diff --git a/src/Compilers/Z/Bounds/Interpretation.v b/src/Compilers/Z/Bounds/Interpretation.v
deleted file mode 100644
index e37b64a09..000000000
--- a/src/Compilers/Z/Bounds/Interpretation.v
+++ /dev/null
@@ -1,289 +0,0 @@
-Require Import Coq.ZArith.ZArith.
-Require Import Crypto.Compilers.Syntax.
-Require Import Crypto.Compilers.Z.Syntax.
-Require Import Crypto.Compilers.SmartMap.
-Require Import Crypto.Compilers.Relations.
-Require Import Crypto.Util.Notations.
-Require Import Crypto.Util.Decidable.
-Require Import Crypto.Util.ZRange.
-Require Import Crypto.Util.ZRange.Operations.
-Require Import Crypto.Util.ZUtil.Definitions.
-Require Import Crypto.Util.Tactics.DestructHead.
-Export Compilers.Syntax.Notations.
-
-Local Notation eta x := (fst x, snd x).
-Local Notation eta3 x := (eta (fst x), snd x).
-Local Notation eta4 x := (eta3 (fst x), snd x).
-
-Notation bounds := zrange.
-Delimit Scope bounds_scope with bounds.
-Local Open Scope Z_scope.
-
-Module Import Bounds.
- Definition t := bounds.
- Bind Scope bounds_scope with t.
- Local Coercion Z.of_nat : nat >-> Z.
- Definition interp_base_type (ty : base_type) : Set := t.
-
- Section ops.
- (** Generic helper definitions *)
- Definition t_map1 (f : Z -> Z) : t -> t
- := fun x => ZRange.two_corners f x.
- Definition t_map2 (f : Z -> Z -> Z) : t -> t -> t
- := fun x y => ZRange.four_corners f x y.
- Definition t_map3 (f : Z -> Z -> Z -> Z) : t -> t -> t -> t
- := fun x y z => ZRange.eight_corners f x y z.
- (** Definitions of the actual bounds propogation *)
- (** Rules for adding new operations:
-
- - Use [t_mapn] to if the underlying operation on [Z] is
- monotonic in all [n] of its arguments ([t_mapn] handles both
- monotonic non-increasing and monotonic non-decreasing) *)
-
- Definition add : t -> t -> t := t_map2 Z.add.
- Definition sub : t -> t -> t := t_map2 Z.sub.
- Definition mul : t -> t -> t := t_map2 Z.mul.
- Definition shl : t -> t -> t := t_map2 Z.shiftl.
- Definition shr : t -> t -> t := t_map2 Z.shiftr.
- Definition max_abs_bound (x : t) : Z
- := upper (ZRange.abs x).
- Definition upper_lor_and_bounds (x y : Z) : Z
- := 2^(1 + Z.log2_up (Z.max x y)).
- Definition extreme_lor_land_bounds (x y : t) : t
- := let mx := max_abs_bound x in
- let my := max_abs_bound y in
- {| lower := -upper_lor_and_bounds mx my ; upper := upper_lor_and_bounds mx my |}.
- Definition extremization_bounds (f : t -> t -> t) (x y : t) : t
- := let (lx, ux) := x in
- let (ly, uy) := y in
- if ((lx <? 0) || (ly <? 0))%Z%bool
- then extreme_lor_land_bounds x y
- else f x y.
- Definition land : t -> t -> t
- := extremization_bounds
- (fun x y
- => let (lx, ux) := x in
- let (ly, uy) := y in
- {| lower := Z.min 0 (Z.min lx ly) ; upper := Z.max 0 (Z.min ux uy) |}).
- Definition lor : t -> t -> t
- := extremization_bounds
- (fun x y
- => let (lx, ux) := x in
- let (ly, uy) := y in
- {| lower := Z.max lx ly;
- upper := 2^(Z.max (Z.log2_up (ux+1)) (Z.log2_up (uy+1))) - 1 |}).
- Definition opp : t -> t := t_map1 Z.opp.
- Definition zselect' (r1 r2 : t) : t
- := let (lr1, ur1) := r1 in
- let (lr2, ur2) := r2 in
- {| lower := Z.min lr1 lr2 ; upper := Z.max ur1 ur2 |}.
- Definition zselect (c r1 r2 : t) : t
- := zselect' r1 r2.
- Definition add_with_carry : t -> t -> t -> t
- := t_map3 Z.add_with_carry.
- Definition sub_with_borrow : t -> t -> t -> t
- := t_map3 Z.sub_with_borrow.
- Definition modulo_pow2_constant : Z -> t -> t
- := fun e x
- => let d := 2^e in
- let (l, u) := (lower x, upper x) in
- {| lower := if l / d =? u / d then Z.min (l mod d) (u mod d) else Z.min 0 (d + 1);
- upper := if l / d =? u / d then Z.max (l mod d) (u mod d) else Z.max 0 (d - 1) |}.
- Definition div_pow2_constant : Z -> t -> t
- := fun e x
- => let d := 2^e in
- let (l, u) := (lower x, upper x) in
- {| lower := l / d ; upper := u / d |}.
- Definition opp_div_pow2_constant : Z -> t -> t
- := fun e x
- => let d := 2^e in
- let (l, u) := (lower x, upper x) in
- {| lower := -(u / d) ; upper := -(l / d) |}.
- Definition neg (int_width : Z) : t -> t
- := fun v
- => let (lb, ub) := v in
- let might_be_one := ((lb <=? 1) && (1 <=? ub))%Z%bool in
- let must_be_one := ((lb =? 1) && (ub =? 1))%Z%bool in
- if must_be_one
- then {| lower := Z.ones int_width ; upper := Z.ones int_width |}
- else if might_be_one
- then {| lower := Z.min 0 (Z.ones int_width) ; upper := Z.max 0 (Z.ones int_width) |}
- else {| lower := 0 ; upper := 0 |}.
- Definition cmovne' (r1 r2 : t) : t
- := let (lr1, ur1) := r1 in
- let (lr2, ur2) := r2 in
- {| lower := Z.min lr1 lr2 ; upper := Z.max ur1 ur2 |}.
- Definition cmovne (x y r1 r2 : t) : t
- := cmovne' r1 r2.
- Definition cmovle' (r1 r2 : t) : t
- := let (lr1, ur1) := r1 in
- let (lr2, ur2) := r2 in
- {| lower := Z.min lr1 lr2 ; upper := Z.max ur1 ur2 |}.
- Definition cmovle (x y r1 r2 : t) : t
- := cmovle' r1 r2.
-
- Definition id_with_alt {T1 T2 Tout} (x : interp_base_type T1) (y : interp_base_type T2)
- : interp_base_type Tout
- := match T1, T2, Tout with
- | TZ, TZ, TZ => y
- | _, _, _ => x
- end.
- End ops.
- Section ops_with_carry.
- Context (carry_boundary_bit_width : Z).
- Definition get_carry : t -> t * t
- := fun v =>
- (modulo_pow2_constant carry_boundary_bit_width v,
- div_pow2_constant carry_boundary_bit_width v).
- Definition get_borrow : t -> t * t
- := fun v =>
- (modulo_pow2_constant carry_boundary_bit_width v,
- opp_div_pow2_constant carry_boundary_bit_width v).
- Definition add_with_get_carry : t -> t -> t -> t * t
- := fun c x y
- => get_carry (add_with_carry c x y).
- Definition sub_with_get_borrow : t -> t -> t -> t * t
- := fun c x y
- => get_borrow (sub_with_borrow c x y).
- Definition mul_split : t -> t -> t * t
- := fun x y => get_carry (mul x y).
- End ops_with_carry.
-
- Module Export Notations.
- Export Util.ZRange.Notations.
- Infix "+" := add : bounds_scope.
- Infix "-" := sub : bounds_scope.
- Infix "*" := mul : bounds_scope.
- Infix "<<" := shl : bounds_scope.
- Infix ">>" := shr : bounds_scope.
- Infix "&'" := land : bounds_scope.
- Notation "- x" := (opp x) : bounds_scope.
- End Notations.
-
- Definition log_bit_width_of_base_type ty : option nat
- := match ty with
- | TZ => None
- | TWord logsz => Some logsz
- end.
-
- Definition bit_width_of_base_type ty : option Z
- := option_map (fun logsz => 2^Z.of_nat logsz)%Z (log_bit_width_of_base_type ty).
-
- Definition truncation_bounds' bit_width (b : t)
- := match bit_width with
- | Some bit_width => if ((0 <=? lower b) && (upper b <? 2^bit_width))%bool
- then b
- else {| lower := 0 ; upper := 2^bit_width - 1 |}
- | None => b
- end.
- Definition truncation_bounds ty : interp_base_type ty -> interp_base_type ty
- := truncation_bounds' (bit_width_of_base_type ty).
-
- Definition interp_op {src dst} (f : op src dst)
- (x : interp_flat_type interp_base_type src)
- : interp_flat_type interp_base_type dst
- := SmartVarfMap
- truncation_bounds
- (match f in op src dst return interp_flat_type interp_base_type src -> interp_flat_type interp_base_type dst with
- | OpConst T v => fun _ => {| lower := v ; upper := v |}
- | Add _ _ T => fun xy => add (fst xy) (snd xy)
- | Sub _ _ T => fun xy => sub (fst xy) (snd xy)
- | Mul _ _ T => fun xy => mul (fst xy) (snd xy)
- | Shl _ _ T => fun xy => shl (fst xy) (snd xy)
- | Shr _ _ T => fun xy => shr (fst xy) (snd xy)
- | Land _ _ T => fun xy => land (fst xy) (snd xy)
- | Lor _ _ T => fun xy => lor (fst xy) (snd xy)
- | Opp _ T => fun x => opp x
- | IdWithAlt _ _ T => fun xy => id_with_alt (fst xy) (snd xy)
- | Zselect _ _ _ T => fun cxy => let '(c, x, y) := eta3 cxy in zselect c x y
- | MulSplit carry_boundary_bit_width _ _ T1 T2
- => fun xy => mul_split carry_boundary_bit_width (fst xy) (snd xy)
- | AddWithCarry _ _ _ T => fun cxy => let '(c, x, y) := eta3 cxy in add_with_carry c x y
- | AddWithGetCarry carry_boundary_bit_width _ _ _ T1 T2
- => fun cxy => let '(c, x, y) := eta3 cxy in
- add_with_get_carry carry_boundary_bit_width c x y
- | SubWithBorrow _ _ _ T => fun cxy => let '(c, x, y) := eta3 cxy in sub_with_borrow c x y
- | SubWithGetBorrow carry_boundary_bit_width _ _ _ T1 T2
- => fun cxy => let '(c, x, y) := eta3 cxy in
- sub_with_get_borrow carry_boundary_bit_width c x y
- end%bounds x).
-
- Definition of_Z (z : Z) : t := ZToZRange z.
-
- Definition of_interp t (z : Syntax.interp_base_type t) : interp_base_type t
- := ZToZRange (interpToZ z).
-
- Definition smallest_logsz
- (round_up : nat -> option nat)
- (b : t)
- : option nat
- := if (0 <=? lower b)%Z
- then Some (Z.to_nat (Z.log2_up (Z.log2_up (1 + upper b))))
- else None.
- Definition actual_logsz
- (round_up : nat -> option nat)
- (b : t)
- : option nat
- := if (0 <=? lower b)%Z
- then let smallest_lgsz := (Z.to_nat (Z.log2_up (Z.log2_up (1 + upper b)))) in
- let lgsz := round_up smallest_lgsz in
- match lgsz with
- | Some lgsz
- => if Nat.leb smallest_lgsz lgsz
- then Some lgsz
- else None
- | None => None
- end
- else None.
- Definition bounds_to_base_type
- {round_up : nat -> option nat}
- (T : base_type)
- (b : interp_base_type T)
- : base_type
- := match T with
- | TZ => match actual_logsz round_up b with
- | Some lgsz => TWord lgsz
- | None => TZ
- end
- | TWord _
- => match smallest_logsz round_up b with
- | Some lgsz => TWord lgsz
- | None => TZ
- end
- end.
-
- Definition option_min (a : nat) (b : option nat)
- := match b with
- | Some b => Nat.min a b
- | None => a
- end.
-
- Definition round_up_to_in_list (allowable_lgsz : list nat)
- (lgsz : nat)
- : option nat
- := let good_lgsz := List.filter (Nat.leb lgsz) allowable_lgsz in
- List.fold_right (fun a b => Some (option_min a b)) None good_lgsz.
-
- Definition ComputeBounds {t} (e : Expr t)
- (input_bounds : interp_flat_type interp_base_type (domain t))
- : interp_flat_type interp_base_type (codomain t)
- := Compilers.Syntax.Interp (@interp_op) e input_bounds.
-
- Definition is_tighter_thanb' {T} : interp_base_type T -> interp_base_type T -> bool
- := is_tighter_than_bool.
-
- Definition is_bounded_by' {T} : interp_base_type T -> Syntax.interp_base_type T -> Prop
- := fun bounds val => is_bounded_by' (bit_width_of_base_type T) bounds (interpToZ val).
-
- Definition is_tighter_thanb {T} : interp_flat_type interp_base_type T -> interp_flat_type interp_base_type T -> bool
- := interp_flat_type_relb_pointwise (@is_tighter_thanb').
-
- Definition is_bounded_by {T} : interp_flat_type interp_base_type T -> interp_flat_type Syntax.interp_base_type T -> Prop
- := interp_flat_type_rel_pointwise (@is_bounded_by').
-
- Local Arguments interp_base_type !_ / .
- Global Instance dec_eq_interp_flat_type : forall {T}, DecidableRel (@eq (interp_flat_type interp_base_type T)) | 10.
- Proof.
- induction T; destruct_head base_type; simpl; exact _.
- Defined.
-End Bounds.