aboutsummaryrefslogtreecommitdiff
path: root/src/Compilers/MultiSizeTest.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compilers/MultiSizeTest.v')
-rw-r--r--src/Compilers/MultiSizeTest.v277
1 files changed, 0 insertions, 277 deletions
diff --git a/src/Compilers/MultiSizeTest.v b/src/Compilers/MultiSizeTest.v
deleted file mode 100644
index c31127126..000000000
--- a/src/Compilers/MultiSizeTest.v
+++ /dev/null
@@ -1,277 +0,0 @@
-Require Import Coq.omega.Omega.
-Require Import Crypto.Compilers.SmartMap.
-
-Set Implicit Arguments.
-Set Asymmetric Patterns.
-
-(** * Preliminaries: bounded and unbounded number types *)
-
-Definition bound8 := 256.
-
-Definition word8 := {n | n < bound8}.
-
-Definition bound9 := 512.
-
-Definition word9 := {n | n < bound9}.
-
-
-(** * Expressions over unbounded words *)
-
-Section unbounded.
- Variable var : Type.
-
- Inductive unbounded :=
- | Const : nat -> unbounded
- | Var : var -> unbounded
- | Plus : unbounded -> unbounded -> unbounded
- | LetIn : unbounded -> (var -> unbounded) -> unbounded.
-End unbounded.
-
-Arguments Const [var] _.
-
-Definition Unbounded := forall var, unbounded var.
-
-Fixpoint unboundedD (e : unbounded nat) : nat :=
- match e with
- | Const n => n
- | Var n => n
- | Plus e1 e2 => unboundedD e1 + unboundedD e2
- | LetIn e1 e2 => unboundedD (e2 (unboundedD e1))
- end.
-
-Definition UnboundedD (E : Unbounded) : nat :=
- unboundedD (E _).
-
-(** * Opt-in bounded types *)
-
-Section bounded.
- Inductive type :=
- | Nat
- | Word8
- | Word9.
-
- Variable var : type -> Type.
-
- Inductive bounded : type -> Type :=
- | BConst : nat -> bounded Nat
- | BConst8 : word8 -> bounded Word8
- | BConst9 : word9 -> bounded Word9
- | BVar : forall t, var t -> bounded t
- | BPlus : bounded Nat -> bounded Nat -> bounded Nat
- | BPlus8 : bounded Word8 -> bounded Word8 -> bounded Word8
- | BPlus9 : bounded Word9 -> bounded Word9 -> bounded Word9
- | BLetIn : forall t1 t2, bounded t1 -> (var t1 -> bounded t2) -> bounded t2
-
- | Unbound : forall t, bounded t -> bounded Nat
- | Bound : forall t, bounded Nat -> bounded t.
-End bounded.
-
-Arguments BConst [var] _.
-Arguments BConst8 [var] _.
-Arguments BConst9 [var] _.
-Arguments BVar [var t] _.
-Arguments Unbound [var t] _.
-Arguments Bound [var] _ _.
-
-Definition Bounded t := forall var, bounded var t.
-
-Definition typeD (t : type) : Type :=
- match t with
- | Nat => nat
- | Word8 => word8
- | Word9 => word9
- end.
-
-Theorem O_lt_S : forall n, O < S n.
-Proof.
- intros; omega.
-Qed.
-
-Definition plus8 (a b : word8) : word8 :=
- let n := proj1_sig a + proj1_sig b in
- match le_lt_dec bound8 n with
- | left _ => exist _ O (O_lt_S _)
- | right pf => exist _ n pf
- end.
-
-Definition plus9 (a b : word9) : word9 :=
- let n := proj1_sig a + proj1_sig b in
- match le_lt_dec bound9 n with
- | left _ => exist _ O (O_lt_S _)
- | right pf => exist _ n pf
- end.
-
-Infix "+8" := plus8 (at level 50).
-Infix "+9" := plus9 (at level 50).
-
-Definition unbound {t} : typeD t -> nat :=
- match t with
- | Nat => fun x => x
- | Word8 => fun x => proj1_sig x
- | Word9 => fun x => proj1_sig x
- end.
-
-Definition bound {t} : nat -> typeD t :=
- match t return nat -> typeD t with
- | Nat => fun x => x
- | Word8 => fun x =>
- match le_lt_dec bound8 x with
- | left _ => exist _ O (O_lt_S _)
- | right pf => exist _ x pf
- end
- | Word9 => fun x =>
- match le_lt_dec bound9 x with
- | left _ => exist _ O (O_lt_S _)
- | right pf => exist _ x pf
- end
- end.
-
-Fixpoint boundedD t (e : bounded typeD t) : typeD t :=
- match e with
- | BConst n => n
- | BConst8 n => n
- | BConst9 n => n
- | BVar _ n => n
- | BPlus e1 e2 => boundedD e1 + boundedD e2
- | BPlus8 e1 e2 => boundedD e1 +8 boundedD e2
- | BPlus9 e1 e2 => boundedD e1 +9 boundedD e2
- | BLetIn _ _ e1 e2 => boundedD (e2 (boundedD e1))
- | Unbound _ e1 => unbound (boundedD e1)
- | Bound _ e1 => bound (boundedD e1)
- end.
-
-Definition BoundedD t (E : Bounded t) : typeD t :=
- boundedD (E _).
-
-
-(** * Insertion of bounded types opportunistically *)
-
-Definition fail {var} : nat * bounded var Nat := (0, BConst 0).
-
-Fixpoint boundOf (eb : unbounded nat) : nat :=
- match eb with
- | Const n => n
- | Var n => n
- | Plus eb1 eb2 => boundOf eb1 + boundOf eb2
- | LetIn eb1 eb2 => boundOf (eb2 (boundOf eb1))
- end.
-
-Fixpoint boundify {var} (eb : unbounded nat) (e : unbounded (var Nat)) : nat * bounded var Nat :=
- match e with
- | Const n => (n,
- match le_lt_dec bound8 n with
- | left _ =>
- match le_lt_dec bound9 n with
- | left _ => BConst n
- | right pf => Unbound (BConst9 (exist _ n pf))
- end
- | right pf => Unbound (BConst8 (exist _ n pf))
- end)
- | Var x =>
- match eb with
- | Var n => (n, BVar x)
- | _ => fail
- end
- | Plus e1 e2 =>
- match eb with
- | Plus eb1 eb2 =>
- let (n1, e1') := boundify eb1 e1 in
- let (n2, e2') := boundify eb2 e2 in
- (n1 + n2,
- if le_lt_dec bound8 (n1 + n2)
- then if le_lt_dec bound9 (n1 + n2)
- then BPlus e1' e2'
- else Unbound (BPlus9 (Bound _ e1') (Bound _ e2'))
- else Unbound (BPlus8 (Bound _ e1') (Bound _ e2')))
- | _ => fail
- end
- | LetIn e1 e2 =>
- match eb with
- | LetIn eb1 eb2 =>
- let (n1, e1') := boundify eb1 e1 in
- (boundOf (eb2 n1), BLetIn e1' (fun x => snd (boundify (eb2 n1) (e2 x))))
- | _ => fail
- end
- end.
-
-Definition Boundify (E : Unbounded) : Bounded Nat :=
- fun _ => snd (boundify (E _) (E _)).
-
-
-(** * Moving [Unbound] operators down from [LetIn]s to their use sites *)
-
-Fixpoint movedown {var t} (e : bounded (bounded var) t) : bounded var t :=
- match e with
- | BConst n => BConst n
- | BConst8 n => BConst8 n
- | BConst9 n => BConst9 n
- | BVar _ e => e
- | BPlus e1 e2 => BPlus (movedown e1) (movedown e2)
- | BPlus8 e1 e2 => BPlus8 (movedown e1) (movedown e2)
- | BPlus9 e1 e2 => BPlus9 (movedown e1) (movedown e2)
- | BLetIn _ _ e1 e2 =>
- match movedown e1 in bounded _ t return (bounded _ t -> _) -> _ with
- | Unbound _ e1'' => fun e2_rec => BLetIn e1'' (fun x => e2_rec (Unbound (BVar x)))
- | e1' => fun e2_rec => BLetIn e1' (fun x => e2_rec (BVar x))
- end (fun x => movedown (e2 x))
- | Unbound _ e1 => Unbound (movedown e1)
- | Bound t e1 => Bound t (movedown e1)
- end.
-
-Definition Movedown t (E : Bounded t) : Bounded t :=
- fun _ => movedown (E _).
-
-
-(** * Canceling matching [Bound] and [Unbound] *)
-
-Definition type_eq_dec : forall t1 t2 : type, {t1 = t2} + {t1 <> t2}.
-Proof.
- decide equality.
-Defined.
-
-Fixpoint cancel {var t} (e : bounded var t) : bounded var t :=
- match e with
- | BConst n => BConst n
- | BConst8 n => BConst8 n
- | BConst9 n => BConst9 n
- | BVar _ x => BVar x
- | BPlus e1 e2 => BPlus (cancel e1) (cancel e2)
- | BPlus8 e1 e2 => BPlus8 (cancel e1) (cancel e2)
- | BPlus9 e1 e2 => BPlus9 (cancel e1) (cancel e2)
- | BLetIn _ _ e1 e2 => BLetIn (cancel e1) (fun x => cancel (e2 x))
- | Unbound _ e1 => Unbound (cancel e1)
- | Bound t e1 =>
- match cancel e1 with
- | Unbound t' e1' =>
- match type_eq_dec t' t with
- | left pf => match pf in _ = T return bounded _ T with
- | eq_refl => e1'
- end
- | right _ => Bound t (Unbound e1')
- end
- | e1' => Bound t e1'
- end
- end.
-
-Definition Cancel t (E : Bounded t) : Bounded t :=
- fun _ => cancel (E _).
-
-
-(** * Examples *)
-
-Example ex1 : Unbounded := fun _ =>
- LetIn (Const 127) (fun a =>
- LetIn (Const 63) (fun b =>
- LetIn (Plus (Var a) (Var b)) (fun c =>
- Plus (Var c) (Var c)))).
-
-Eval compute in (UnboundedD ex1).
-
-Definition ex1b := Boundify ex1.
-Eval compute in ex1b.
-
-Definition ex1bm := Movedown (Boundify ex1).
-Eval compute in ex1bm.
-
-Definition ex1bmc := Cancel (Movedown (Boundify ex1)).
-Eval compute in ex1bmc.