(**
 	Module: Symbol	
	Description: Symbols' information in faust.
	@author WANG Haisheng	
	Created: 05/08/2013	Modified: 05/08/2013
*)

open Types;;

exception Symbol_error of string;;

(* MACRO *)
let delay_memory_length = 100000;;
let rdtable_memory_length = 100000;;
let rwtable_memory_length = 100000;;
let vectorize_memory_length = 1000;;

let dictionary_of_symbol : symbol -> (int * int) * int * string =
  fun (s : symbol) ->
    match s with
    |Add	 ->  ((2, 1), 0, "Add")
    |Sub	 ->  ((2, 1), 0, "Sub")		
    |Mul	 ->  ((2, 1), 0, "Mul")
    |Div	 ->  ((2, 1), 0, "Div")
    |Power       ->  ((2, 1), 0, "Power")
    |Pass	 ->  ((1, 1), 0, "Pass")
    |Stop	 ->  ((1, 0), 0, "Stop")		
    |And	 ->  ((2, 1), 0, "And")
    |Or 	 ->  ((2, 1), 0, "Or")
    |Xor         ->  ((2, 1), 0, "Xor")
    |Mem	 ->  ((1, 1), 0, "Mem")
    |Delay	 ->  ((2, 1), delay_memory_length, "Delay")
    |Floor	 ->  ((1, 1), 0, "Floor")
    |Ceil	 ->  ((1, 1), 0, "Ceil")
    |Rint	 ->  ((1, 1), 0, "Rint")
    |Int	 ->  ((1, 1), 0, "Int")
    |Float	 ->  ((1, 1), 0, "Float")
    |Sin	 ->  ((1, 1), 0, "Sin")
    |Asin	 ->  ((1, 1), 0, "Asin")
    |Cos	 ->  ((1, 1), 0, "Cos")
    |Acos	 ->  ((1, 1), 0, "Acos")
    |Tan	 ->  ((1, 1), 0, "Tan")
    |Atan	 ->  ((1, 1), 0, "Atan")
    |Atan2	 ->  ((2, 1), 0, "Atan2")
    |Exp	 ->  ((1, 1), 0, "Exp")
    |Sqrt	 ->  ((1, 1), 0, "Sqrt")
    |Ln 	 ->  ((1, 1), 0, "Ln")
    |Lg 	 ->  ((1, 1), 0, "Lg")
    |Abs         ->  ((1, 1), 0, "Abs")
    |Mod  	 ->  ((2, 1), 0, "Mod")
    |Fmod  	 ->  ((2, 1), 0, "Fmod")
    |Remainder 	 ->  ((2, 1), 0, "Remainder")
    |Vectorize	 ->  ((2, 1), vectorize_memory_length, "Vectorize")
    |Vconcat	 ->  ((2, 1), 0, "Vconcat")
    |Vpick	 ->  ((2, 1), 0, "Vpick")
    |Serialize	 ->  ((1, 1), 0, "Serialize")
    |Gt 	 ->  ((2, 1), 0, "Gt")
    |Lt 	 ->  ((2, 1), 0, "Lt")
    |Geq 	 ->  ((2, 1), 0, "Geq")
    |Leq 	 ->  ((2, 1), 0, "Leq")
    |Eq 	 ->  ((2, 1), 0, "Eq")
    |Neq 	 ->  ((2, 1), 0, "Neq")
    |Shl         ->  ((2, 1), 0, "shift_left")
    |Shr         ->  ((2, 1), 0, "shift_right")
    |Max         ->  ((2, 1), 0, "Max") 
    |Min         ->  ((2, 1), 0, "Min")
    |Prefix	 ->  ((2, 1), 0, "Prefix")
    |Select2	 ->  ((3, 1), 0, "Select2")
    |Select3     ->  ((4, 1), 0, "Select3")
    |Rdtable	 ->  ((3, 1), rdtable_memory_length, "Rdtalbe")
    |Rwtable	 ->  ((5, 1), rwtable_memory_length, "Rwtable")
    |Button      ->  ((0, 1), 0, "Button")
    |Checkbox    ->  ((0, 1), 0, "Checkbox")
    |Vslider     ->  ((0, 1), 0, "Vslider")
    |Hslider     ->  ((0, 1), 0, "Hslider")
    |Vgroup      ->  ((0, 1), 0, "Vgroup")
    |Hgroup      ->  ((0, 1), 0, "Hgroup")
    |Tgroup      ->  ((0, 1), 0, "Tgroup")
    |Hbargraph   ->  ((0, 1), 0, "Hbargraph")
    |Vbargraph   ->  ((0, 1), 0, "Vbargraph")
    |Nentry      ->  ((0, 1), 0, "Nentry")
    |Attach      ->  ((2, 1), 0, "Attach") ;;

let dimension_of_symbol : symbol -> int * int =
  fun (s : symbol) ->
    match (dictionary_of_symbol s) with
    | (dimension, delay, name) -> dimension;;

let delay_of_symbol : symbol -> int =
  fun (s : symbol) ->
    match (dictionary_of_symbol s) with
    | (dimension, delay, name) -> delay;;

let string_of_symbol : symbol -> string = 
  fun (s : symbol) ->
    match (dictionary_of_symbol s) with
    | (dimension, delay, name) -> name;;