aboutsummaryrefslogtreecommitdiffstats
path: root/src/hls/HTLPargen.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/hls/HTLPargen.v')
-rw-r--r--src/hls/HTLPargen.v131
1 files changed, 76 insertions, 55 deletions
diff --git a/src/hls/HTLPargen.v b/src/hls/HTLPargen.v
index e9061a5..99461d0 100644
--- a/src/hls/HTLPargen.v
+++ b/src/hls/HTLPargen.v
@@ -36,6 +36,7 @@ Require Import vericert.hls.Predicate.
Require Import vericert.common.Errormonad.
Import ErrorMonad.
Import ErrorMonadExtra.
+Import MonadNotation.
#[local] Open Scope monad_scope.
@@ -48,59 +49,78 @@ Import ErrorMonadExtra.
Record control_regs: Type := mk_control_regs {
ctrl_st : reg;
ctrl_stack : reg;
- ctrl_preg : reg;
ctrl_fin : reg;
ctrl_return : reg;
}.
-Definition pred_lit (preg: reg) (pred: predicate) :=
- Vrange preg (Vlit (posToValue pred)) (Vlit (posToValue pred)).
-
-Fixpoint pred_expr (preg: reg) (p: pred_op) :=
+(* Definition pred_lit (preg: reg) (pred: predicate) := *)
+(* Vrange preg (Vlit (posToValue pred)) (Vlit (posToValue pred)). *)
+
+(* Fixpoint pred_expr (preg: reg) (p: pred_op) := *)
+(* match p with *)
+(* | Plit (b, pred) => *)
+(* if b *)
+(* then pred_lit preg pred *)
+(* else Vunop Vnot (pred_lit preg pred) *)
+(* | Ptrue => Vlit (ZToValue 1) *)
+(* | Pfalse => Vlit (ZToValue 0) *)
+(* | Pand p1 p2 => *)
+(* Vbinop Vand (pred_expr preg p1) (pred_expr preg p2) *)
+(* | Por p1 p2 => *)
+(* Vbinop Vor (pred_expr preg p1) (pred_expr preg p2) *)
+(* end. *)
+
+Definition pred_enc (pred: predicate) :=
+ xI pred.
+
+Definition reg_enc (r: reg) :=
+ xO r.
+
+Fixpoint pred_expr (p: pred_op) :=
match p with
| Plit (b, pred) =>
if b
- then pred_lit preg pred
- else Vunop Vnot (pred_lit preg pred)
+ then Vvar (pred_enc pred)
+ else Vunop Vnot (Vvar (pred_enc pred))
| Ptrue => Vlit (ZToValue 1)
| Pfalse => Vlit (ZToValue 0)
| Pand p1 p2 =>
- Vbinop Vand (pred_expr preg p1) (pred_expr preg p2)
+ Vbinop Vand (pred_expr p1) (pred_expr p2)
| Por p1 p2 =>
- Vbinop Vor (pred_expr preg p1) (pred_expr preg p2)
+ Vbinop Vor (pred_expr p1) (pred_expr p2)
end.
Definition assignment : Type := expr -> expr -> stmnt.
Definition translate_predicate (a : assignment)
- (preg: reg) (p: option pred_op) (dst e: expr) :=
+ (p: option pred_op) (dst e: expr) :=
match p with
| None => a dst e
| Some pos =>
let pos' := deep_simplify peq pos in
match sat_pred_simple (negate pos') with
| None => a dst e
- | Some _ => a dst (Vternary (pred_expr preg pos') e dst)
+ | Some _ => a dst (Vternary (pred_expr pos') e dst)
end
end.
-Definition state_goto (preg: reg) (p: option pred_op) (st : reg) (n : node) : stmnt :=
- translate_predicate Vblock preg p (Vvar st) (Vlit (posToValue n)).
+Definition state_goto (p: option pred_op) (st : reg) (n : node) : stmnt :=
+ translate_predicate Vblock p (Vvar st) (Vlit (posToValue n)).
-Definition state_cond (preg: reg) (p: option pred_op) (st : reg) (c : expr) (n1 n2 : node) : stmnt :=
- translate_predicate Vblock preg p (Vvar st) (Vternary c (posToExpr n1) (posToExpr n2)).
+Definition state_cond (p: option pred_op) (st : reg) (c : expr) (n1 n2 : node) : stmnt :=
+ translate_predicate Vblock p (Vvar st) (Vternary c (posToExpr n1) (posToExpr n2)).
-Definition nonblock (dst : reg) (e : expr) := Vnonblock (Vvar dst) e.
-Definition block (dst : reg) (e : expr) := Vblock (Vvar dst) e.
+Definition nonblock (dst : reg) (e : expr) := Vnonblock (Vvar (reg_enc dst)) e.
+Definition block (dst : reg) (e : expr) := Vblock (Vvar (reg_enc dst)) e.
Definition bop (op : binop) (r1 r2 : reg) : expr :=
- Vbinop op (Vvar r1) (Vvar r2).
+ Vbinop op (Vvar (reg_enc r1)) (Vvar (reg_enc r2)).
Definition boplit (op : binop) (r : reg) (l : Integers.int) : expr :=
- Vbinop op (Vvar r) (Vlit (intToValue l)).
+ Vbinop op (Vvar (reg_enc r)) (Vlit (intToValue l)).
Definition boplitz (op: binop) (r: reg) (l: Z) : expr :=
- Vbinop op (Vvar r) (Vlit (ZToValue l)).
+ Vbinop op (Vvar (reg_enc r)) (Vlit (ZToValue l)).
Definition error {A} m := @Errors.Error A (Errors.msg m).
@@ -180,7 +200,7 @@ Definition translate_eff_addressing (a: Op.addressing) (args: list reg) : Errors
else Errors.Error (Errors.msg "Veriloggen: translate_eff_addressing (Aindexed2): address out of bounds")
| Op.Aindexed2scaled scale offset, r1::r2::nil => (* Typical for dynamic array addressing *)
if (check_address_parameter_signed scale) && (check_address_parameter_signed offset)
- then Errors.OK (Vbinop Vadd (Vvar r1) (Vbinop Vadd (boplitz Vmul r2 scale) (Vlit (ZToValue offset))))
+ then Errors.OK (Vbinop Vadd (Vvar (reg_enc r1)) (Vbinop Vadd (boplitz Vmul r2 scale) (Vlit (ZToValue offset))))
else Errors.Error (Errors.msg "Veriloggen: translate_eff_addressing (Aindexed2scaled): address out of bounds")
| Op.Ainstack a, nil => (* We need to be sure that the base address is aligned *)
let a := Integers.Ptrofs.unsigned a in
@@ -196,9 +216,9 @@ Definition translate_eff_addressing (a: Op.addressing) (args: list reg) : Errors
(** Translate an instruction to a statement. FIX mulhs mulhu *)
Definition translate_instr (op : Op.operation) (args : list reg) : Errors.res expr :=
match op, args with
- | Op.Omove, r::nil => Errors.OK (Vvar r)
+ | Op.Omove, r::nil => Errors.OK (Vvar (reg_enc r))
| Op.Ointconst n, _ => Errors.OK (Vlit (intToValue n))
- | Op.Oneg, r::nil => Errors.OK (Vunop Vneg (Vvar r))
+ | Op.Oneg, r::nil => Errors.OK (Vunop Vneg (Vvar (reg_enc r)))
| Op.Osub, r1::r2::nil => Errors.OK (bop Vsub r1 r2)
| Op.Omul, r1::r2::nil => Errors.OK (bop Vmul r1 r2)
| Op.Omulimm n, r::nil => Errors.OK (boplit Vmul r n)
@@ -214,15 +234,15 @@ Definition translate_instr (op : Op.operation) (args : list reg) : Errors.res ex
| Op.Oorimm n, r::nil => Errors.OK (boplit Vor r n)
| Op.Oxor, r1::r2::nil => Errors.OK (bop Vxor r1 r2)
| Op.Oxorimm n, r::nil => Errors.OK (boplit Vxor r n)
- | Op.Onot, r::nil => Errors.OK (Vunop Vnot (Vvar r))
+ | Op.Onot, r::nil => Errors.OK (Vunop Vnot (Vvar (reg_enc r)))
| Op.Oshl, r1::r2::nil => Errors.OK (bop Vshl r1 r2)
| Op.Oshlimm n, r::nil => Errors.OK (boplit Vshl r n)
| Op.Oshr, r1::r2::nil => Errors.OK (bop Vshr r1 r2)
| Op.Oshrimm n, r::nil => Errors.OK (boplit Vshr r n)
| Op.Oshrximm n, r::nil =>
- Errors.OK (Vternary (Vbinop Vlt (Vvar r) (Vlit (ZToValue 0)))
- (Vunop Vneg (Vbinop Vshru (Vunop Vneg (Vvar r)) (Vlit n)))
- (Vbinop Vshru (Vvar r) (Vlit n)))
+ Errors.OK (Vternary (Vbinop Vlt (Vvar (reg_enc r)) (Vlit (ZToValue 0)))
+ (Vunop Vneg (Vbinop Vshru (Vunop Vneg (Vvar (reg_enc r))) (Vlit n)))
+ (Vbinop Vshru (Vvar (reg_enc r)) (Vlit n)))
| Op.Oshru, r1::r2::nil => Errors.OK (bop Vshru r1 r2)
| Op.Oshruimm n, r::nil => Errors.OK (boplit Vshru r n)
| Op.Ororimm n, r::nil => Errors.Error (Errors.msg "Htlpargen: Instruction not implemented: Ororimm")
@@ -232,7 +252,7 @@ Definition translate_instr (op : Op.operation) (args : list reg) : Errors.res ex
| Op.Ocmp c, _ => translate_condition c args
| Op.Osel c AST.Tint, r1::r2::rl =>
do tc <- translate_condition c rl;
- Errors.OK (Vternary tc (Vvar r1) (Vvar r2))
+ Errors.OK (Vternary tc (Vvar (reg_enc r1)) (Vvar (reg_enc r2)))
| Op.Olea a, _ => translate_eff_addressing a args
| _, _ => Errors.Error (Errors.msg "Htlpargen: Instruction not implemented: other")
end.
@@ -267,18 +287,18 @@ Fixpoint enumerate (i : nat) (ns : list node) {struct ns} : list (nat * node) :=
Definition tbl_to_case_expr (st : reg) (ns : list node) : list (expr * stmnt) :=
List.map (fun a => match a with
- (i, n) => (Vlit (natToValue i), Vnonblock (Vvar st) (Vlit (posToValue n)))
+ (i, n) => (Vlit (natToValue i), Vblock (Vvar st) (Vlit (posToValue n)))
end)
(enumerate 0 ns).
-Definition translate_cfi (fin rtrn state preg: reg) p (cfi: cf_instr)
+Definition translate_cfi (fin rtrn state: reg) p (cfi: cf_instr)
: Errors.res stmnt :=
match cfi with
| RBgoto n' =>
- Errors.OK (state_goto preg p state n')
+ Errors.OK (state_goto p state n')
| RBcond c args n1 n2 =>
do e <- translate_condition c args;
- Errors.OK (state_cond preg p state e n1 n2)
+ Errors.OK (state_cond p state e n1 n2)
| RBreturn r =>
match r with
| Some r' =>
@@ -296,7 +316,7 @@ Definition translate_cfi (fin rtrn state preg: reg) p (cfi: cf_instr)
Errors.Error (Errors.msg "HTLPargen: RBbuildin not supported.")
end.
-Definition transf_instr (fin rtrn stack state preg: reg)
+Definition transf_instr (fin rtrn stack state: reg)
(dc: pred_op * stmnt) (i: instr)
: Errors.res (pred_op * stmnt) :=
let '(curr_p, d) := dc in
@@ -305,38 +325,38 @@ Definition transf_instr (fin rtrn stack state preg: reg)
| RBnop => Errors.OK dc
| RBop p op args dst =>
do instr <- translate_instr op args;
- let stmnt := translate_predicate Vblock preg (npred p) (Vvar dst) instr in
+ let stmnt := translate_predicate Vblock (npred p) (Vvar dst) instr in
Errors.OK (curr_p, Vseq d stmnt)
| RBload p mem addr args dst =>
do src <- translate_arr_access mem addr args stack;
- let stmnt := translate_predicate Vnonblock preg (npred p) (Vvar dst) src in
+ let stmnt := translate_predicate Vblock (npred p) (Vvar dst) src in
Errors.OK (curr_p, Vseq d stmnt)
| RBstore p mem addr args src =>
do dst <- translate_arr_access mem addr args stack;
- let stmnt := translate_predicate Vnonblock preg (npred p) dst (Vvar src) in
+ let stmnt := translate_predicate Vblock (npred p) dst (Vvar src) in
Errors.OK (curr_p, Vseq d stmnt)
| RBsetpred p' cond args p =>
do cond' <- translate_condition cond args;
- let stmnt := translate_predicate Vblock preg (npred p') (pred_expr preg (Plit (true, p))) cond' in
+ let stmnt := translate_predicate Vblock (npred p') (pred_expr (Plit (true, p))) cond' in
Errors.OK (curr_p, Vseq d stmnt)
| RBexit p cf =>
- do d_stmnt <- translate_cfi fin rtrn state preg (npred p) cf;
+ do d_stmnt <- translate_cfi fin rtrn state (npred p) cf;
Errors.OK (Pand curr_p (negate (dfltp p)), Vseq d d_stmnt)
end.
-Definition transf_chained_block (fin rtrn stack state preg: reg)
+Definition transf_chained_block (fin rtrn stack state: reg)
(dc: @pred_op positive * stmnt)
(block: list instr)
: Errors.res (pred_op * stmnt) :=
- mfold_left (transf_instr fin rtrn stack state preg) block (ret dc).
+ mfold_left (transf_instr fin rtrn stack state) block (ret dc).
-Definition transf_parallel_block (fin rtrn stack state preg: reg)
+Definition transf_parallel_block (fin rtrn stack state: reg)
(dc: @pred_op positive * stmnt)
(block: list (list instr))
: Errors.res (pred_op * stmnt) :=
- mfold_left (transf_chained_block fin rtrn stack state preg) block (ret dc).
+ mfold_left (transf_chained_block fin rtrn stack state) block (ret dc).
-Definition transf_parallel_full_block (fin rtrn stack state preg: reg)
+Definition transf_parallel_full_block (fin rtrn stack state: reg)
(dc: node * @pred_op positive * datapath)
(block: list (list instr))
: Errors.res (node * pred_op * datapath) :=
@@ -344,25 +364,25 @@ Definition transf_parallel_full_block (fin rtrn stack state preg: reg)
match AssocMap.get n dt with
| None =>
do ctrl_init_stmnt <-
- translate_cfi fin rtrn state preg (Some curr_p) (RBgoto (n - 1)%positive);
- do dc' <- transf_parallel_block fin rtrn stack state preg (curr_p, ctrl_init_stmnt) block;
+ translate_cfi fin rtrn state (Some curr_p) (RBgoto (n - 1)%positive);
+ do dc' <- transf_parallel_block fin rtrn stack state (curr_p, ctrl_init_stmnt) block;
let '(curr_p', dt_stmnt) := dc' in
Errors.OK ((n - 1)%positive, curr_p', AssocMap.set n dt_stmnt dt)
| _ => Errors.Error (msg "HtlPargen.transf_parallel_full_block: block not empty")
end.
-Definition transf_seq_block (fin rtrn stack state preg: reg)
+Definition transf_seq_block (fin rtrn stack state: reg)
(d: datapath) (n: node)
(block: list (list (list instr)))
: Errors.res datapath :=
do res <- mfold_left
- (transf_parallel_full_block fin rtrn stack state preg) block (ret (n, Ptrue, d));
+ (transf_parallel_full_block fin rtrn stack state) block (ret (n, Ptrue, d));
let '(_, _, d') := res in
Errors.OK d'.
Definition transf_seq_blockM (ctrl: control_regs) (d: datapath) (ni: node * ParBB.t): res datapath :=
let (n, i) := ni in
- transf_seq_block ctrl.(ctrl_fin) ctrl.(ctrl_return) ctrl.(ctrl_stack) ctrl.(ctrl_st) ctrl.(ctrl_preg) d n i.
+ transf_seq_block ctrl.(ctrl_fin) ctrl.(ctrl_return) ctrl.(ctrl_stack) ctrl.(ctrl_st) d n i.
Definition stack_correct (sz : Z) : bool :=
(0 <=? sz) && (sz <? Integers.Ptrofs.modulus) && (Z.modulo sz 4 =? 0).
@@ -396,9 +416,9 @@ Proof.
simplify. transitivity (Z.pos (max_pc_map m)); eauto.
Qed.
-Definition decide_order a b c d e f g h : {module_ordering a b c d e f g h} + {True}.
+Definition decide_order a b c d e f g : {module_ordering a b c d e f g} + {True}.
refine (match bool_dec ((a <? b) && (b <? c) && (c <? d)
- && (d <? e) && (e <? f) && (f <? g) && (g <? h))%positive true with
+ && (d <? e) && (e <? f) && (f <? g))%positive true with
| left t => left _
| _ => _
end); auto.
@@ -407,20 +427,22 @@ Definition decide_order a b c d e f g h : {module_ordering a b c d e f g h} + {T
end; unfold module_ordering; auto.
Defined.
+Definition max_resource_function (f: function) :=
+ Pos.max (reg_enc (max_reg_function f)) (pred_enc (max_pred_function f)).
+
Program Definition transl_module (f: function) : res DHTL.module :=
if stack_correct f.(fn_stacksize) then
- let st := Pos.succ (max_reg_function f) in
+ let st := Pos.succ (max_resource_function f) in
let fin := Pos.succ st in
let rtrn := Pos.succ fin in
let stack := Pos.succ rtrn in
let start := Pos.succ stack in
let rst := Pos.succ start in
let clk := Pos.succ rst in
- let preg := Pos.succ clk in
- do _stmnt <- mfold_left (transf_seq_blockM (mk_control_regs st stack preg fin rtrn))
+ do _stmnt <- mfold_left (transf_seq_blockM (mk_control_regs st stack fin rtrn))
(Maps.PTree.elements f.(GiblePar.fn_code)) (ret (PTree.empty _));
match zle (Z.pos (max_pc_map _stmnt)) Integers.Int.max_unsigned,
- decide_order st fin rtrn stack start rst clk preg,
+ decide_order st fin rtrn stack start rst clk,
max_list_dec (GiblePar.fn_params f) st
with
| left LEDATA, left MORD, left WFPARAMS =>
@@ -436,7 +458,6 @@ Program Definition transl_module (f: function) : res DHTL.module :=
start
rst
clk
- preg
(AssocMap.empty _)
(AssocMap.empty _)
None