diff options
Diffstat (limited to 'psl/psl-cse.adb')
-rw-r--r-- | psl/psl-cse.adb | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/psl/psl-cse.adb b/psl/psl-cse.adb deleted file mode 100644 index 5d6f3df13..000000000 --- a/psl/psl-cse.adb +++ /dev/null @@ -1,201 +0,0 @@ -with Ada.Text_IO; -with PSL.Prints; -with Types; use Types; - -package body PSL.CSE is - function Is_X_And_Not_X (A, B : Node) return Boolean is - begin - return (Get_Kind (A) = N_Not_Bool - and then Get_Boolean (A) = B) - or else (Get_Kind (B) = N_Not_Bool - and then Get_Boolean (B) = A); - end Is_X_And_Not_X; - - type Hash_Table_Type is array (Uns32 range 0 .. 128) of Node; - Hash_Table : Hash_Table_Type := (others => Null_Node); - - function Compute_Hash (L, R : Node; Op : Uns32) return Uns32 - is - begin - return Shift_Left (Get_Hash (L), 12) - xor Shift_Left (Get_Hash (R), 2) - xor Op; - end Compute_Hash; - - function Compute_Hash (L: Node; Op : Uns32) return Uns32 - is - begin - return Shift_Left (Get_Hash (L), 2) xor Op; - end Compute_Hash; - - procedure Dump_Hash_Table (Level : Natural := 0) - is - use Ada.Text_IO; - Cnt : Natural; - Total : Natural; - N : Node; - begin - Total := 0; - for I in Hash_Table_Type'Range loop - Cnt := 0; - N := Hash_Table (I); - while N /= Null_Node loop - Cnt := Cnt + 1; - N := Get_Hash_Link (N); - end loop; - Put_Line ("Hash_table(" & Uns32'Image (I) - & "):" & Natural'Image (Cnt)); - Total := Total + Cnt; - if Level > 0 then - Cnt := 0; - N := Hash_Table (I); - while N /= Null_Node loop - Put (Uns32'Image (Get_Hash (N))); - if Level > 1 then - Put (": "); - PSL.Prints.Dump_Expr (N); - New_Line; - end if; - Cnt := Cnt + 1; - N := Get_Hash_Link (N); - end loop; - if Level = 1 and then Cnt > 0 then - New_Line; - end if; - end if; - end loop; - Put_Line ("Total:" & Natural'Image (Total)); - end Dump_Hash_Table; - - function Build_Bool_And (L, R : Node) return Node - is - R1 : Node; - Res : Node; - Hash : Uns32; - Head, H : Node; - begin - if L = True_Node then - return R; - elsif R = True_Node then - return L; - elsif L = False_Node or else R = False_Node then - return False_Node; - elsif L = R then - return L; - elsif Is_X_And_Not_X (L, R) then - return False_Node; - end if; - - -- More simple optimizations. - if Get_Kind (R) = N_And_Bool then - R1 := Get_Left (R); - if L = R1 then - return R; - elsif Is_X_And_Not_X (L, R1) then - return False_Node; - end if; - end if; - - Hash := Compute_Hash (L, R, 2); - Head := Hash_Table (Hash mod Hash_Table'Length); - H := Head; - while H /= Null_Node loop - if Get_Hash (H) = Hash - and then Get_Kind (H) = N_And_Bool - and then Get_Left (H) = L - and then Get_Right (H) = R - then - return H; - end if; - H := Get_Hash_Link (H); - end loop; - - Res := Create_Node (N_And_Bool); - Set_Left (Res, L); - Set_Right (Res, R); - Set_Hash_Link (Res, Head); - Set_Hash (Res, Hash); - Hash_Table (Hash mod Hash_Table'Length) := Res; - return Res; - end Build_Bool_And; - - function Build_Bool_Or (L, R : Node) return Node - is - Res : Node; - Hash : Uns32; - Head, H : Node; - begin - if L = True_Node then - return L; - elsif R = True_Node then - return R; - elsif L = False_Node then - return R; - elsif R = False_Node then - return L; - elsif L = R then - return L; - elsif Is_X_And_Not_X (L, R) then - return True_Node; - end if; - - Hash := Compute_Hash (L, R, 3); - Head := Hash_Table (Hash mod Hash_Table'Length); - H := Head; - while H /= Null_Node loop - if Get_Hash (H) = Hash - and then Get_Kind (H) = N_Or_Bool - and then Get_Left (H) = L - and then Get_Right (H) = R - then - return H; - end if; - H := Get_Hash_Link (H); - end loop; - - Res := Create_Node (N_Or_Bool); - Set_Left (Res, L); - Set_Right (Res, R); - Set_Hash_Link (Res, Head); - Set_Hash (Res, Hash); - Hash_Table (Hash mod Hash_Table'Length) := Res; - return Res; - end Build_Bool_Or; - - function Build_Bool_Not (N : Node) return Node is - Res : Node; - Hash : Uns32; - Head : Node; - H : Node; - begin - if N = True_Node then - return False_Node; - elsif N = False_Node then - return True_Node; - elsif Get_Kind (N) = N_Not_Bool then - return Get_Boolean (N); - end if; - - -- Find in hash table. - Hash := Compute_Hash (N, 1); - Head := Hash_Table (Hash mod Hash_Table'Length); - H := Head; - while H /= Null_Node loop - if Get_Hash (H) = Hash - and then Get_Kind (H) = N_Not_Bool - and then Get_Boolean (H) = N - then - return H; - end if; - H := Get_Hash_Link (H); - end loop; - - Res := Create_Node (N_Not_Bool); - Set_Boolean (Res, N); - Set_Hash_Link (Res, Head); - Set_Hash (Res, Hash); - Hash_Table (Hash mod Hash_Table'Length) := Res; - - return Res; - end Build_Bool_Not; -end PSL.CSE; |