diff options
-rw-r--r-- | sched/main.ml | 4 | ||||
-rw-r--r-- | sched/netlist_dumb.ml | 156 | ||||
-rw-r--r-- | sched/netlist_printer.ml | 94 |
3 files changed, 158 insertions, 96 deletions
diff --git a/sched/main.ml b/sched/main.ml index 1b4b9d8..ab6ef30 100644 --- a/sched/main.ml +++ b/sched/main.ml @@ -25,14 +25,14 @@ let compile filename = Netlist_printer.print_program out !q; close_out out; let dumb_out = open_out dumb_out_name in - Netlist_printer.print_dumb_program dumb_out !q; + Netlist_dumb.print_program dumb_out !q; close_out dumb_out; let out_opt = open_out out_opt_name in Netlist_printer.print_program out_opt !q_opt; close_out out_opt; let dumb_opt_out = open_out dumb_opt_out_name in - Netlist_printer.print_dumb_program dumb_opt_out !q_opt; + Netlist_dumb.print_program dumb_opt_out !q_opt; close_out dumb_opt_out; if !simulate then ( diff --git a/sched/netlist_dumb.ml b/sched/netlist_dumb.ml new file mode 100644 index 0000000..19b16a8 --- /dev/null +++ b/sched/netlist_dumb.ml @@ -0,0 +1,156 @@ +(* PRINTER FOR DUMBED-DOWN NETLIST + (the format used by the C simulator) +*) + +open Netlist_ast +open Format + +(* Alternative program AST format, better corresponding to the dumb syntax *) + +type var_def = { + name : string; + size : int } +type var_id = int +type const_val = bool array +(* keep type binop from netlist_ast *) + +type const_var = { dest : var_id; value : const_val } +type reg_var = { dest : var_id; source : var_id } +type ram_var = { dest : var_id; + addr_size : int; word_size : int; + read_addr : var_id; write_enable : var_id; + write_addr : var_id; data : var_id } + +type dumb_exp = + | Dcopy of var_id (* copy a variable - these cannot be eliminated totally *) + | Dnot of var_id + | Dbinop of binop * var_id * var_id + | Dmux of var_id * var_id * var_id + | Drom of int * int * var_id + | Dconcat of var_id * var_id + | Dslice of int * int * var_id + | Dselect of int * var_id + +type dumb_equation = var_id * dumb_exp + +type dumb_program = { + d_vars : var_def list; + d_inputs : var_id list; + d_outputs : var_id list; + d_regs : reg_var list; + d_rams : ram_var list; + d_eqs : dumb_equation list } + +(* Convert a program to a dumb program *) + +let mkbinstr a = + let r = String.make (Array.length a) '0' in + for i = 0 to Array.length a - 1 do + if a.(i) then r.[i] <- '1' + done; + r + +let make_program_dumb p = + let vars = ref [] in + let var_map = Hashtbl.create (Env.size p.p_vars) in + () (* TODO *) + (* + 1. Identify constants and create new variables for them, put them on the variable list + 2. Create map from variable identifier to variable ID, add them to variable list + 3. Extract regs and rams into separate list + 4. Reformat equation list (replace constants by the coresponding constant variables) + 5. Done. + *) + + + +(* constants *) +let c_arg = 0 +let c_reg = 1 +let c_not = 2 +let c_binop = 3 +let c_mux = 4 +let c_rom = 5 +let c_ram = 6 +let c_concat = 7 +let c_slice = 8 +let c_select = 9 + +let binop_i = function + | Or -> 0 + | Xor -> 1 + | And -> 2 + | Nand -> 3 + +let print_program oc p = + let ff = formatter_of_out_channel oc in + (* associate numbers to variables *) + let n_vars = Env.fold (fun _ _ n -> n+1) p.p_vars 0 in + let n = ref 0 in + let var_id = Hashtbl.create n_vars in + fprintf ff "%d\n" n_vars; + Env.iter + (fun k v -> + Hashtbl.add var_id k !n; + fprintf ff "%d %s\n" + (match v with + | TBit -> 1 + | TBitArray(n) -> n) + k; + n := !n + 1) + p.p_vars; + (* write input vars *) + fprintf ff "%d" (List.length p.p_inputs); + List.iter (fun k -> fprintf ff " %d" (Hashtbl.find var_id k)) p.p_inputs; + fprintf ff "\n"; + (* write output vars *) + fprintf ff "%d" (List.length p.p_outputs); + List.iter (fun k -> fprintf ff " %d" (Hashtbl.find var_id k)) p.p_outputs; + fprintf ff "\n"; + (* write equations *) + fprintf ff "%d\n" (List.length p.p_eqs); + (* write equations *) + let print_arg = function + | Avar(k) -> fprintf ff " $%d" (Hashtbl.find var_id k) + | Aconst(n) -> fprintf ff " "; + begin match n with + | VBit(x) -> fprintf ff "%d" (if x then 1 else 0) + | VBitArray(a) -> + for i = 0 to Array.length a - 1 do + fprintf ff "%d" (if a.(i) then 1 else 0) + done + end + in + List.iter + (fun (k, eqn) -> + fprintf ff "%d " (Hashtbl.find var_id k); + begin match eqn with + | Earg(a) -> fprintf ff "%d" c_arg; + print_arg a + | Ereg(i) -> fprintf ff "%d %d" c_reg (Hashtbl.find var_id i) + | Enot(a) -> fprintf ff "%d" c_not; + print_arg a + | Ebinop(o, a, b) -> fprintf ff "%d %d" c_binop (binop_i o); + print_arg a; + print_arg b + | Emux(a, b, c) -> fprintf ff "%d" c_mux; + print_arg a; print_arg b; print_arg c + | Erom(u, v, a) -> fprintf ff "%d %d %d" c_rom u v; + print_arg a + | Eram (u, v, a, b, c, d) -> fprintf ff "%d %d %d" c_ram u v; + print_arg a; print_arg b; print_arg c; print_arg d + | Econcat(a, b) -> fprintf ff "%d" c_concat; + print_arg a; print_arg b + | Eslice(u, v, a) -> fprintf ff "%d %d %d" c_slice u v; + print_arg a + | Eselect(i, a) -> fprintf ff "%d %d" c_select i; + print_arg a + end; + fprintf ff "\n") + p.p_eqs; + (* flush *) + fprintf ff "@." + + + + diff --git a/sched/netlist_printer.ml b/sched/netlist_printer.ml index 746867f..547a0be 100644 --- a/sched/netlist_printer.ml +++ b/sched/netlist_printer.ml @@ -1,8 +1,6 @@ open Netlist_ast open Format -(* GENERAL PRINTER *) - let rec print_env print lp sep rp ff env = let first = ref true in fprintf ff "%s" lp; @@ -84,95 +82,3 @@ let print_program oc p = fprintf ff "@." -(* PRINTER FOR DUMBED-DOWN NETLIST (variables are identified by numbers) *) - -(* constants *) -let c_arg = 0 -let c_reg = 1 -let c_not = 2 -let c_binop = 3 -let c_mux = 4 -let c_rom = 5 -let c_ram = 6 -let c_concat = 7 -let c_slice = 8 -let c_select = 9 - -let binop_i = function - | Or -> 0 - | Xor -> 1 - | And -> 2 - | Nand -> 3 - -let print_dumb_program oc p = - let ff = formatter_of_out_channel oc in - (* associate numbers to variables *) - let n_vars = Env.fold (fun _ _ n -> n+1) p.p_vars 0 in - let n = ref 0 in - let var_id = Hashtbl.create n_vars in - fprintf ff "%d\n" n_vars; - Env.iter - (fun k v -> - Hashtbl.add var_id k !n; - fprintf ff "%d %s\n" - (match v with - | TBit -> 1 - | TBitArray(n) -> n) - k; - n := !n + 1) - p.p_vars; - (* write input vars *) - fprintf ff "%d" (List.length p.p_inputs); - List.iter (fun k -> fprintf ff " %d" (Hashtbl.find var_id k)) p.p_inputs; - fprintf ff "\n"; - (* write output vars *) - fprintf ff "%d" (List.length p.p_outputs); - List.iter (fun k -> fprintf ff " %d" (Hashtbl.find var_id k)) p.p_outputs; - fprintf ff "\n"; - (* write equations *) - fprintf ff "%d\n" (List.length p.p_eqs); - (* write equations *) - let print_arg = function - | Avar(k) -> fprintf ff " $%d" (Hashtbl.find var_id k) - | Aconst(n) -> fprintf ff " "; - begin match n with - | VBit(x) -> fprintf ff "%d" (if x then 1 else 0) - | VBitArray(a) -> - for i = 0 to Array.length a - 1 do - fprintf ff "%d" (if a.(i) then 1 else 0) - done - end - in - List.iter - (fun (k, eqn) -> - fprintf ff "%d " (Hashtbl.find var_id k); - begin match eqn with - | Earg(a) -> fprintf ff "%d" c_arg; - print_arg a - | Ereg(i) -> fprintf ff "%d %d" c_reg (Hashtbl.find var_id i) - | Enot(a) -> fprintf ff "%d" c_not; - print_arg a - | Ebinop(o, a, b) -> fprintf ff "%d %d" c_binop (binop_i o); - print_arg a; - print_arg b - | Emux(a, b, c) -> fprintf ff "%d" c_mux; - print_arg a; print_arg b; print_arg c - | Erom(u, v, a) -> fprintf ff "%d %d %d" c_rom u v; - print_arg a - | Eram (u, v, a, b, c, d) -> fprintf ff "%d %d %d" c_ram u v; - print_arg a; print_arg b; print_arg c; print_arg d - | Econcat(a, b) -> fprintf ff "%d" c_concat; - print_arg a; print_arg b - | Eslice(u, v, a) -> fprintf ff "%d %d %d" c_slice u v; - print_arg a - | Eselect(i, a) -> fprintf ff "%d %d" c_select i; - print_arg a - end; - fprintf ff "\n") - p.p_eqs; - (* flush *) - fprintf ff "@." - - - - |