Skip to content

Commit 678016f

Browse files
committed
chore: think of how to reduce sext/zext to existing ops
1 parent b164a8e commit 678016f

File tree

1 file changed

+23
-17
lines changed

1 file changed

+23
-17
lines changed

SSA/Experimental/Bits/Fast/ZextSext.lean

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,28 @@ inductive NatExpr (n : Nat) : Type
66
| var : (v : Fin n) → NatExpr n
77
| add : NatExpr n → NatExpr n → NatExpr n
88

9-
def NatExpr.eval (e : NatExpr n) (env : Fin n → Nat) : Nat :=
9+
def NatExpr.toDefEqBV (e : NatExpr n) (env : Fin n → Nat) : Nat :=
1010
match e with
1111
| .var v => env v
12-
| .add e1 e2 => NatExpr.eval e1 env + NatExpr.eval e2 env
12+
| .add e1 e2 => NatExpr.toDefEqBV e1 env + NatExpr.toDefEqBV e2 env
1313

1414
-- inductive NatPredicate (n : Nat) : Type
1515
-- | eq : NatExpr n → NatExpr n → NatPredicate n
1616

17-
-- def NatPredicate.eval (env : Fin n → Nat) : NatPredicate n → Prop
18-
-- | .eq e1 e2 => NatExpr.eval e1 env = NatExpr.eval e2 env
17+
-- def NatPredicate.toDefEqBV (env : Fin n → Nat) : NatPredicate n → Prop
18+
-- | .eq e1 e2 => NatExpr.toDefEqBV e1 env = NatExpr.toDefEqBV e2 env
1919
--
2020
-- def NatPredicate.decide : NatPredicate n → Bool := sorry
2121
--
22-
-- theorem NatPredicate.decide_iff_eval (p : NatPredicate n) :
23-
-- (∀ (env : Fin n → Nat), p.eval env) ↔
22+
-- theorem NatPredicate.decide_iff_toDefEqBV (p : NatPredicate n) :
23+
-- (∀ (env : Fin n → Nat), p.toDefEqBV env) ↔
2424
-- (p.decide = true) := sorry
2525

2626
-- theorem foo : ∀ (n m : Nat), n + m = m + n := by
2727
-- -- (NatPredicate.eq (NatExpr.add (NatExpr.var 0) (NatExpr.var 1))
28-
-- -- (NatExpr.add (NatExpr.var 1) (NatExpr.var 0))).eval (...)
28+
-- -- (NatExpr.add (NatExpr.var 1) (NatExpr.var 0))).toDefEqBV (...)
2929
-- -- revert env
30-
-- -- apply NatPredicate.decide_iff_eval |>.mpr (by rfl)
30+
-- -- apply NatPredicate.decide_iff_toDefEqBV |>.mpr (by rfl)
3131
-- sorry
3232

3333
namespace BV
@@ -41,29 +41,35 @@ inductive BVExpr (ctx : BVTyCtx natCard bvCard) : (NatExpr natCard) → Type
4141
| append (a : BVExpr ctx v) (b : BVExpr ctx w) : BVExpr ctx (.add v w)
4242

4343
abbrev BVEnv (tyCtx : BVTyCtx natCard bvCard) (natEnv : Fin natCard → Nat) :=
44-
(v : Fin bvCard) → BitVec ((tyCtx v).eval natEnv)
44+
(v : Fin bvCard) → BitVec ((tyCtx v).toDefEqBV natEnv)
4545

46-
def BVExpr.eval {natEnv : Fin n → Nat} (bvEnv : BVEnv bvCard natEnv) :
47-
BVExpr bvCard w → BitVec (w.eval natEnv)
46+
def BVExpr.toDefEqBV {natEnv : Fin n → Nat} (bvEnv : BVEnv bvCard natEnv) :
47+
BVExpr bvCard w → BitVec (w.toDefEqBV natEnv)
4848
| .var v => bvEnv v
49-
| .add a b => a.eval bvEnv + b.eval bvEnv
50-
| .append a b => a.eval bvEnv ++ b.eval bvEnv
49+
| .add a b => a.toDefEqBV bvEnv + b.toDefEqBV bvEnv
50+
| .append a b => a.toDefEqBV bvEnv ++ b.toDefEqBV bvEnv
5151

5252
inductive BVPredicate (ctx : BVTyCtx natCard bvCard) : Type
5353
| eq (a : BVExpr ctx w) (b : BVExpr ctx w)
5454

55-
def BVPredicate.eval {natEnv : Fin natCard → Nat} {ctx : BVTyCtx natCard bvCard}
55+
def BVPredicate.toDefEqBV {natEnv : Fin natCard → Nat} {ctx : BVTyCtx natCard bvCard}
5656
(bvEnv : BVEnv ctx natEnv) :
5757
BVPredicate ctx → Prop
58-
| .eq a b => a.eval bvEnv = b.eval bvEnv
58+
| .eq a b => a.toDefEqBV bvEnv = b.toDefEqBV bvEnv
5959

6060
def BVPredicate.decide (ctx : BVTyCtx natCard bvCard) :
6161
BVPredicate ctx → Bool
6262
| .eq a b => false
6363

64-
theorem BVPredicate.eval_of_decide (ctx : BVTyCtx natCard bvCard)
64+
65+
/-- Rewrite rule to express msb in terms of slt. -/
66+
theorem BitVec.msb_iff_slt_zero (bv : BitVec w) :
67+
bv.msb = true ↔ bv.slt 0#w = true := by
68+
simp [BitVec.msb_eq_toInt, BitVec.slt_eq_decide]
69+
70+
theorem BVPredicate.toDefEqBV_of_decide (ctx : BVTyCtx natCard bvCard)
6571
(p : BVPredicate ctx) (h : p.decide = true) :
66-
∀ (bvEnv : BVEnv ctx natEnv), p.eval bvEnv := by
72+
∀ (bvEnv : BVEnv ctx natEnv), p.toDefEqBV bvEnv := by
6773
sorry
6874

6975
inductive Expr

0 commit comments

Comments
 (0)