aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <git@yannherklotz.com>2021-02-22 19:04:52 +0000
committerYann Herklotz <git@yannherklotz.com>2021-02-22 19:04:52 +0000
commit75641815724c68791cc2754e850b35700e07e586 (patch)
tree8a47101dd7d01d80e90ce18a265aced7e4a82058
parentb34a08dd656664352e400379d2e890ad95e3afc2 (diff)
downloadvericert-kvx-dev/divider.tar.gz
vericert-kvx-dev/divider.zip
Get some Verilog output with dividersdev/divider
-rw-r--r--src/hls/HTLPargen.v25
-rw-r--r--src/hls/PrintVerilog.ml8
2 files changed, 22 insertions, 11 deletions
diff --git a/src/hls/HTLPargen.v b/src/hls/HTLPargen.v
index e1c7ec8..629f53e 100644
--- a/src/hls/HTLPargen.v
+++ b/src/hls/HTLPargen.v
@@ -671,7 +671,7 @@ Definition translate_predicate (a : assignment)
ret (a dst (Vternary (pred_expr preg pos) e dst))
end.
-Definition translate_inst a (fin rtrn stack preg : reg) (n : node) (i : instr)
+Definition translate_inst a (fu : funct_units) (fin rtrn stack preg : reg) (n : node) (i : instr)
: mon stmnt :=
match i with
| RBnop =>
@@ -690,8 +690,14 @@ Definition translate_inst a (fin rtrn stack preg : reg) (n : node) (i : instr)
| RBsetpred c args p =>
do cond <- translate_condition c args;
ret (a (pred_expr preg (Pvar p)) cond)
- | RBpiped p f args => error (Errors.msg "HTLPargen.translate_inst: piped")
- | RBassign p f src dst => error (Errors.msg "HTLPargen.translate_inst: assign")
+ | RBpiped p f args =>
+ match PTree.get f fu.(avail_units), args with
+ | Some (SignedDiv s n d q _), r1::r2::nil =>
+ ret (Vseq (a (Vvar n) (Vvar r1)) (a (Vvar d) (Vvar r2)))
+ | _, _ => error (Errors.msg "HTLPargen.translate_inst: not a signed divide.")
+ end
+ | RBassign p f src dst =>
+ ret (a (Vvar dst) (Vvar src))
end.
Lemma create_new_state_state_incr:
@@ -721,12 +727,13 @@ Definition create_new_state (p: node): mon node :=
s.(st_funct_units))
(create_new_state_state_incr s p).
-Definition translate_inst_list (fin rtrn stack preg: reg) (ni : node * node * list (list instr)) :=
+Definition translate_inst_list (fu: funct_units)
+ (fin rtrn stack preg: reg) (ni : node * node * list (list instr)) :=
match ni with
| (n, p, li) =>
do _ <- collectlist
(fun l =>
- do stmnt <- translate_inst Vblock fin rtrn stack preg n l;
+ do stmnt <- translate_inst Vblock fu fin rtrn stack preg n l;
add_data_instr n stmnt) (concat li);
do st <- get;
add_control_instr n (state_goto st.(st_st) p)
@@ -773,11 +780,11 @@ Definition translate_cfi (fin rtrn stack preg: reg) (ni: node * cf_instr)
do _ <- add_control_instr n c;
add_data_instr n s.
-Definition transf_bblock (fin rtrn stack preg: reg) (ni : node * bblock)
+Definition transf_bblock (fu: funct_units) (fin rtrn stack preg: reg) (ni : node * bblock)
: mon unit :=
let (n, bb) := ni in
do nstate <- create_new_state ((poslength bb.(bb_body)))%positive;
- do _ <- collectlist (translate_inst_list fin rtrn stack preg)
+ do _ <- collectlist (translate_inst_list fu fin rtrn stack preg)
(prange n (nstate + poslength bb.(bb_body) - 1)%positive
bb.(bb_body));
match bb.(bb_body) with
@@ -792,7 +799,7 @@ Definition transf_module (f: function) : mon HTL.module :=
do (stack, stack_len) <- create_arr None 32
(Z.to_nat (f.(fn_stacksize) / 4));
do preg <- create_reg None 32;
- do _ <- collectlist (transf_bblock fin rtrn stack preg)
+ do _ <- collectlist (transf_bblock f.(fn_funct_units) fin rtrn stack preg)
(Maps.PTree.elements f.(fn_code));
do _ <- collectlist (fun r => declare_reg (Some Vinput) r 32)
f.(fn_params);
@@ -818,7 +825,7 @@ Definition transf_module (f: function) : mon HTL.module :=
start
rst
clk
- initial_funct_units
+ f.(fn_funct_units)
current_state.(st_scldecls)
current_state.(st_arrdecls)
(conj (max_pc_wf _ LECTRL) (max_pc_wf _ LEDATA)))
diff --git a/src/hls/PrintVerilog.ml b/src/hls/PrintVerilog.ml
index 824623e..da3bd6e 100644
--- a/src/hls/PrintVerilog.ml
+++ b/src/hls/PrintVerilog.ml
@@ -178,11 +178,15 @@ let make_io i io r = concat [indent i; io; " "; register r; ";\n"]
let print_funct_units clk = function
| SignedDiv (stages, numer, denom, quot, rem) ->
- sprintf "div_signed #(.stages(%d)) divs(.clk(%s), .clken(1'b1), .numer(%s), .denom(%s), .quotient(%s), .remain(%s))\n"
+ sprintf ("div_signed #(.stages(%d)) divs(.clk(%s), " ^^
+ ".clken(1'b1), .numer(%s), .denom(%s), " ^^
+ ".quotient(%s), .remain(%s))\n")
(P.to_int stages)
(register clk) (register numer) (register denom) (register quot) (register rem)
| UnsignedDiv (stages, numer, denom, quot, rem) ->
- sprintf "div_unsigned #(.stages(%d)) divs(.clk(%s), .clken(1'b1), .numer(%s), .denom(%s), .quotient(%s), .remain(%s))\n"
+ sprintf ("div_unsigned #(.stages(%d)) divs(.clk(%s), " ^^
+ ".clken(1'b1), .numer(%s), .denom(%s), " ^^
+ ".quotient(%s), .remain(%s))\n")
(P.to_int stages)
(register clk) (register numer) (register denom) (register quot) (register rem)