⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 variable.ml

📁 FFTW, a collection of fast C routines to compute the Discrete Fourier Transform in one or more dime
💻 ML
字号:
(* * Copyright (c) 1997-1999, 2003 Massachusetts Institute of Technology * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * *)(* $Id: variable.ml,v 1.21 2003/03/16 23:43:46 stevenj Exp $ *)(* Data types and functions for dealing with variables in symbolic * expressions and the abstract syntax tree. *)(* Variables fall into one of four categories: temporary variables * (which the generator can add or delete at will), named (fixed) * variables, and the real/imaginary parts of complex arrays.  Arrays * can be either input arrays, output arrays, or arrays of precomputed * twiddle factors (roots of unity). *)type array =     Input  | Output  | Twiddletype variable =    Temporary of int  | Named of string  | RealArrayElem of (array * int)  | ImagArrayElem of (array * int)let make_temporary =  let tmp_count = ref 0  in fun () -> begin    tmp_count := !tmp_count + 1;    Temporary !tmp_count  endlet is_temporary = function    Temporary _ -> true  | _ -> falselet is_output = function    RealArrayElem (Output, _) -> true  | ImagArrayElem (Output, _) -> true  | _ -> falselet is_input = function    RealArrayElem (Input, _) -> true  | ImagArrayElem (Input, _) -> true  | _ -> falselet is_twiddle = function    RealArrayElem (Twiddle, _) -> true  | ImagArrayElem (Twiddle, _) -> true  | _ -> falselet same = (=)let hash = function  | RealArrayElem (Input, i) ->  i * 8  | ImagArrayElem (Input, i) ->  -i * 8 + 1  | RealArrayElem (Output, i) ->  i * 8 + 2  | ImagArrayElem (Output, i) ->  -i * 8 + 3  | RealArrayElem (Twiddle, i) ->  i * 8 + 4  | ImagArrayElem (Twiddle, i) ->  -i * 8 + 5  | _ -> 0  let similar a b =   same a b or  (match (a, b) with    (RealArrayElem (a1, k1), ImagArrayElem (a2, k2)) ->       a1 = a2 && k1 = k2  | (ImagArrayElem (a1, k1), RealArrayElem (a2, k2)) ->       a1 = a2 && k1 = k2  | _ -> false)    (* true if assignment of a clobbers variable b *)let clobbers a b =  match (a, b) with    (RealArrayElem (Output, k1), RealArrayElem (Input, k2)) -> k1 = k2  | (ImagArrayElem (Output, k1), ImagArrayElem (Input, k2)) -> k1 = k2  | _ -> false(* true if a is the real part and b the imaginary of the same array *)let real_imag a b =  match (a, b) with    (RealArrayElem (a1, k1), ImagArrayElem (a2, k2)) ->       a1 = a2 && k1 = k2   | _ -> false(* true if a and b are elements of the same array, and a has smaller index *)let increasing_indices a b =  match (a, b) with    (RealArrayElem (a1, k1), RealArrayElem (a2, k2)) ->       a1 = a2 && k1 < k2   | (RealArrayElem (a1, k1), ImagArrayElem (a2, k2)) ->       a1 = a2 && k1 < k2   | (ImagArrayElem (a1, k1), RealArrayElem (a2, k2)) ->       a1 = a2 && k1 < k2   | (ImagArrayElem (a1, k1), ImagArrayElem (a2, k2)) ->       a1 = a2 && k1 < k2   | _ -> falselet access array k =  (RealArrayElem (array, k),  ImagArrayElem (array, k))let access_input = access Inputlet access_output = access Outputlet access_twiddle = access Twiddlelet make_named name = Named namelet unparse_index name stride k =   let index =     match (stride, k) with      (_, 0) -> "0"    | (Some s, 1) -> s    | (Some s, (-1)) -> "-" ^ s    | (None, k) -> (string_of_int k)    | (Some s, k) -> (string_of_int k) ^ " * " ^ s   in name ^ "[" ^ index ^ "]"let default_unparser = function      Temporary k -> "tmp" ^ (string_of_int k)    | Named s -> s    | _ -> failwith "attempt to unparse unknown variable"let make_unparser (input_name, input_stride)    (output_name, output_stride)    (twiddle_name, twiddle_stride) =  let rec unparse_var = function    | RealArrayElem (array, k) ->        "c_re(" ^ (unparse_array array k) ^ ")"    | ImagArrayElem (array, k) ->        "c_im(" ^ (unparse_array array k) ^ ")"    | x -> default_unparser x  and unparse_array = function      Input -> unparse_index input_name input_stride    | Output -> unparse_index output_name output_stride    | Twiddle -> unparse_index twiddle_name twiddle_stride  in unparse_varlet make_real2hc_unparser (input_name, input_stride)    (real_output_name, real_output_stride)    (imag_output_name, imag_output_stride) = function    | RealArrayElem (Input, k) ->	unparse_index input_name input_stride k    | ImagArrayElem (Input, _) ->	failwith "trying to access imaginary part of real input"    | RealArrayElem (Output, k) ->	unparse_index real_output_name real_output_stride k    | ImagArrayElem (Output, k) ->	unparse_index imag_output_name imag_output_stride k    | x -> default_unparser xlet make_hc2real_unparser     (real_input_name, real_input_stride)    (imag_input_name, imag_input_stride)    (output_name, output_stride) = function    | RealArrayElem (Input, k) ->	unparse_index real_input_name real_input_stride k    | ImagArrayElem (Input, k) ->	unparse_index imag_input_name imag_input_stride k    | RealArrayElem (Output, k) ->	unparse_index output_name output_stride k    | ImagArrayElem (Output, _) ->	failwith "trying to access imaginary part of real output"    | x -> default_unparser xlet make_hc2hc_forward_unparser n    (first_name, first_stride)    (second_name, second_stride)    (twiddle_name, twiddle_stride) = function    | RealArrayElem (Input, k) ->	unparse_index first_name first_stride k    | ImagArrayElem (Input, k) ->	unparse_index second_name second_stride (k - n + 1)    | RealArrayElem (Output, k) ->	unparse_index first_name first_stride k    | ImagArrayElem (Output, k) ->	unparse_index second_name second_stride (- k)    | RealArrayElem (Twiddle, k) ->	"c_re(" ^ (unparse_index twiddle_name twiddle_stride k) ^ ")"    | ImagArrayElem (Twiddle, k) ->	"c_im(" ^ (unparse_index twiddle_name twiddle_stride k) ^ ")"    | x -> default_unparser xlet make_hc2hc_backward_unparser n    (first_name, first_stride)    (second_name, second_stride)    (twiddle_name, twiddle_stride) = function    | RealArrayElem (Input, k) ->	unparse_index first_name first_stride k    | ImagArrayElem (Input, k) ->	unparse_index second_name second_stride (- k)    | RealArrayElem (Output, k) ->	unparse_index first_name first_stride k    | ImagArrayElem (Output, k) ->	unparse_index second_name second_stride (k - n + 1)    | RealArrayElem (Twiddle, k) ->	"c_re(" ^ (unparse_index twiddle_name twiddle_stride k) ^ ")"    | ImagArrayElem (Twiddle, k) ->	"c_im(" ^ (unparse_index twiddle_name twiddle_stride k) ^ ")"    | x -> default_unparser xlet make_realeven_unparser (input_name, input_stride)    (real_output_name, real_output_stride) = function    | RealArrayElem (Input, k) ->	unparse_index input_name input_stride k    | ImagArrayElem (Input, _) ->	failwith "trying to access imaginary part of real input"    | RealArrayElem (Output, k) ->	unparse_index real_output_name real_output_stride k    | ImagArrayElem (Output, k) ->	failwith "trying to access imaginary part of real output"    | x -> default_unparser xlet make_realodd_unparser (input_name, input_stride)    (imag_output_name, imag_output_stride) = function    | RealArrayElem (Input, k) ->	unparse_index input_name input_stride (k - 1)    | ImagArrayElem (Input, _) ->	failwith "trying to access imaginary part of real input"    | RealArrayElem (Output, k) ->	failwith "trying to access real part of imaginary output"    | ImagArrayElem (Output, k) ->	unparse_index imag_output_name imag_output_stride (k - 1)    | x -> default_unparser xlet make_realodd2_unparser (input_name, input_stride)    (imag_output_name, imag_output_stride) = function    | RealArrayElem (Input, k) ->	unparse_index input_name input_stride k    | ImagArrayElem (Input, _) ->	failwith "trying to access imaginary part of real input"    | RealArrayElem (Output, k) ->	failwith "trying to access real part of imaginary output"    | ImagArrayElem (Output, k) ->	unparse_index imag_output_name imag_output_stride (k - 1)    | x -> default_unparser xlet make_mp3dct_unparser (input_name, input_stride)    (real_output_name, real_output_stride) = function    | RealArrayElem (Input, k) ->	unparse_index input_name input_stride k    | ImagArrayElem (Input, _) ->	failwith "trying to access imaginary part of real input"    | RealArrayElem (Output, k) ->	unparse_index real_output_name real_output_stride k    | ImagArrayElem (Output, k) ->	failwith "trying to access imaginary part of real output"    | x -> default_unparser x

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -