let type_conversion ty1 ty2 =
let ty1 = typeRemoveAttributes ["const";"volatile"] (unrollType ty1) in
let ty2 = typeRemoveAttributes ["const";"volatile"] (unrollType ty2) in
let sig1 = typeSig ty1 and sig2 = typeSig ty2 in
try
let _,_,ty1_to_ty2,ty2_to_ty1 =
Hashtbl.find type_conversion_table (sig1,sig2)
in
ty1_to_ty2,ty2_to_ty1
with Not_found ->
try
let _,_,ty2_to_ty1,ty1_to_ty2 =
Hashtbl.find type_conversion_table (sig2,sig1)
in
ty1_to_ty2,ty2_to_ty1
with Not_found ->
let n1 = type_name ty1 and n2 = type_name ty2 in
let ty1_to_ty2 = unique_logic_name (n1 ^ "_to_" ^ n2) in
let ty2_to_ty1 = unique_logic_name (n2 ^ "_to_" ^ n1) in
Hashtbl.add
type_conversion_table (sig1,sig2) (ty1,ty2,ty1_to_ty2,ty2_to_ty1);
ty1_to_ty2,ty2_to_ty1