summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rewriter.ml107
1 files changed, 61 insertions, 46 deletions
diff --git a/src/rewriter.ml b/src/rewriter.ml
index 8a0c0599..5c5258a4 100644
--- a/src/rewriter.ml
+++ b/src/rewriter.ml
@@ -72,12 +72,72 @@ let rec match_to_program_vars ns bounds =
(*let _ = Printf.eprintf "adding n %s to program var %s\n" (n_to_string n) ev in*)
(n,(augment,ev))::(match_to_program_vars ns bounds)
+let explode s =
+ let rec exp i l = if i < 0 then l else exp (i - 1) (s.[i] :: l) in
+ exp (String.length s - 1) []
+
+
+let vector_string_to_bit_list lit =
+
+ let hexchar_to_binlist = function
+ | '0' -> ['0';'0';'0';'0']
+ | '1' -> ['0';'0';'0';'1']
+ | '2' -> ['0';'0';'1';'0']
+ | '3' -> ['0';'0';'1';'1']
+ | '4' -> ['0';'1';'0';'0']
+ | '5' -> ['0';'1';'0';'1']
+ | '6' -> ['0';'1';'1';'0']
+ | '7' -> ['0';'1';'1';'1']
+ | '8' -> ['1';'0';'0';'0']
+ | '9' -> ['1';'0';'0';'1']
+ | 'A' -> ['1';'0';'1';'0']
+ | 'B' -> ['1';'0';'1';'1']
+ | 'C' -> ['1';'1';'0';'0']
+ | 'D' -> ['1';'1';'0';'1']
+ | 'E' -> ['1';'1';'1';'0']
+ | 'F' -> ['1';'1';'1';'1']
+ | _ -> raise (Reporting_basic.err_unreachable Parse_ast.Unknown "hexchar_to_binlist given unrecognized character") in
+
+ let s_bin = match lit with
+ | L_hex s_hex -> List.flatten (List.map hexchar_to_binlist (explode s_hex))
+ | L_bin s_bin -> explode (String.uppercase s_bin)
+ | _ -> raise (Reporting_basic.err_unreachable Parse_ast.Unknown "s_bin given non vector literal") in
+
+ List.map (function '0' -> L_aux (L_zero, Parse_ast.Unknown)
+ | '1' -> L_aux (L_one,Parse_ast.Unknown)
+ | _ -> raise (Reporting_basic.err_unreachable Parse_ast.Unknown "binary had non-zero or one")) s_bin
+
+let rewrite_pat rewriters nmap (P_aux (pat,(l,annot))) =
+ let rewrap p = P_aux (p,(l,annot)) in
+ let rewrite = rewriters.rewrite_pat rewriters nmap in
+ match pat with
+ | P_lit (L_aux ((L_hex _ | L_bin _) as lit,_)) ->
+ let ps = List.map (fun p -> P_aux (P_lit p,(Parse_ast.Unknown,simple_annot {t = Tid "bit"})))
+ (vector_string_to_bit_list lit) in
+ rewrap (P_vector ps)
+ | P_lit _ | P_wild | P_id _ -> rewrap pat
+ | P_as(pat,id) -> rewrap (P_as( rewrite pat, id))
+ | P_typ(typ,pat) -> rewrap (P_typ(typ,rewrite pat))
+ | P_app(id ,pats) -> rewrap (P_app(id, List.map rewrite pats))
+ | P_record(fpats,_) ->
+ rewrap (P_record(List.map (fun (FP_aux(FP_Fpat(id,pat),pannot)) -> FP_aux(FP_Fpat(id, rewrite pat), pannot)) fpats,
+ false))
+ | P_vector pats -> rewrap (P_vector(List.map rewrite pats))
+ | P_vector_indexed ipats -> rewrap (P_vector_indexed(List.map (fun (i,pat) -> (i, rewrite pat)) ipats))
+ | P_vector_concat pats -> rewrap (P_vector_concat (List.map rewrite pats))
+ | P_tup pats -> rewrap (P_tup (List.map rewrite pats))
+ | P_list pats -> rewrap (P_list (List.map rewrite pats))
+
let rewrite_exp rewriters nmap (E_aux (exp,(l,annot))) =
let rewrap e = E_aux (e,(l,annot)) in
let rewrite = rewriters.rewrite_exp rewriters nmap in
match exp with
| E_block exps -> rewrap (E_block (List.map rewrite exps))
| E_nondet exps -> rewrap (E_nondet (List.map rewrite exps))
+ | E_lit (L_aux ((L_hex _ | L_bin _) as lit,_)) ->
+ let es = List.map (fun p -> E_aux (E_lit p ,(Parse_ast.Unknown,simple_annot {t = Tid "bit"})))
+ (vector_string_to_bit_list lit) in
+ rewrap (E_vector es)
| E_id _ | E_lit _ -> rewrap exp
| E_cast (typ, exp) -> rewrap (E_cast (typ, rewrite exp))
| E_app (id,exps) -> rewrap (E_app (id,List.map rewrite exps))
@@ -241,55 +301,10 @@ let rewrite_defs_base rewriters (Defs defs) =
| [] -> []
| d::ds -> (rewriters.rewrite_def rewriters d)::(rewrite ds) in
Defs (rewrite defs)
-
-let explode s =
- let rec exp i l = if i < 0 then l else exp (i - 1) (s.[i] :: l) in
- exp (String.length s - 1) []
-
-
-let vector_string_to_bit_list lit =
-
- let hexchar_to_binlist = function
- | '0' -> ['0';'0';'0';'0']
- | '1' -> ['0';'0';'0';'1']
- | '2' -> ['0';'0';'1';'0']
- | '3' -> ['0';'0';'1';'1']
- | '4' -> ['0';'1';'0';'0']
- | '5' -> ['0';'1';'0';'1']
- | '6' -> ['0';'1';'1';'0']
- | '7' -> ['0';'1';'1';'1']
- | '8' -> ['1';'0';'0';'0']
- | '9' -> ['1';'0';'0';'1']
- | 'A' -> ['1';'0';'1';'0']
- | 'B' -> ['1';'0';'1';'1']
- | 'C' -> ['1';'1';'0';'0']
- | 'D' -> ['1';'1';'0';'1']
- | 'E' -> ['1';'1';'1';'0']
- | 'F' -> ['1';'1';'1';'1'] in
-
- let s_bin = match lit with
- | L_hex s_hex -> List.flatten (List.map hexchar_to_binlist (explode s_hex))
- | L_bin s_bin -> explode (String.uppercase s_bin) in
-
- List.map (function '0' -> L_aux (L_zero, Unknown) | '1' -> L_aux (L_one,Unknown)) s_bin
-
-let remove_vector_string_patterns pat = match pat with
- | P_lit (L_aux (lit,_)) ->
- let ps = List.map (fun p -> P_aux (P_lit p,(Unknown,simple_annot {t = Tid "bit"})))
- (vector_string_to_bit_list lit) in
- P_vector ps
- | _ -> pat
-let remove_vector_string_expressions exp = match exp with
- | E_lit (L_aux (lit,_)) ->
- let es = List.map (fun p -> E_aux (E_lit p ,(Unknown,simple_annot {t = Tid "bit"})))
- (vector_string_to_bit_list lit) in
- E_vector es
- | _ -> exp
-
let rewrite_defs (Defs defs) = rewrite_defs_base
{rewrite_exp = rewrite_exp;
- rewrite_pat = (fun _ _ p -> p);
+ rewrite_pat = rewrite_pat;
rewrite_let = rewrite_let;
rewrite_lexp = rewrite_lexp;
rewrite_fun = rewrite_fun;