aboutsummaryrefslogtreecommitdiffstats
path: root/src/psl/psl-hash.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2014-11-04 20:14:19 +0100
committerTristan Gingold <tgingold@free.fr>2014-11-04 20:14:19 +0100
commit9c195bf5d86d67ea5eb419ccf6e48dc153e57c68 (patch)
tree575346e529b99e26382b4a06f6ff2caa0b391ab2 /src/psl/psl-hash.adb
parent184a123f91e07c927292d67462561dc84f3a920d (diff)
downloadghdl-9c195bf5d86d67ea5eb419ccf6e48dc153e57c68.tar.gz
ghdl-9c195bf5d86d67ea5eb419ccf6e48dc153e57c68.tar.bz2
ghdl-9c195bf5d86d67ea5eb419ccf6e48dc153e57c68.zip
Move sources to src/ subdirectory.
Diffstat (limited to 'src/psl/psl-hash.adb')
-rw-r--r--src/psl/psl-hash.adb60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/psl/psl-hash.adb b/src/psl/psl-hash.adb
new file mode 100644
index 000000000..62744b336
--- /dev/null
+++ b/src/psl/psl-hash.adb
@@ -0,0 +1,60 @@
+with GNAT.Table;
+
+package body PSL.Hash is
+
+ type Index_Type is new Natural;
+ No_Index : constant Index_Type := 0;
+
+ type Cell_Record is record
+ Res : Node;
+ Next : Index_Type;
+ end record;
+
+ Hash_Size : constant Index_Type := 127;
+
+ package Cells is new GNAT.Table
+ (Table_Component_Type => Cell_Record,
+ Table_Index_Type => Index_Type,
+ Table_Low_Bound => 0,
+ Table_Initial => 256,
+ Table_Increment => 100);
+
+ procedure Init is
+ begin
+ Cells.Set_Last (Hash_Size - 1);
+ for I in 0 .. Hash_Size - 1 loop
+ Cells.Table (I) := (Res => Null_Node, Next => No_Index);
+ end loop;
+ end Init;
+
+ function Get_PSL_Node (Hdl : Int32) return Node is
+ Idx : Index_Type := Index_Type (Hdl mod Int32 (Hash_Size));
+ N_Idx : Index_Type;
+ Res : Node;
+ begin
+ -- In the primary table.
+ Res := Cells.Table (Idx).Res;
+ if Res = Null_Node then
+ Res := Create_Node (N_HDL_Expr);
+ Set_HDL_Node (Res, Hdl);
+ Cells.Table (Idx).Res := Res;
+ return Res;
+ end if;
+
+ loop
+ if Get_HDL_Node (Res) = Hdl then
+ return Res;
+ end if;
+ -- Look in collisions chain
+ N_Idx := Cells.Table (Idx).Next;
+ exit when N_Idx = No_Index;
+ Idx := N_Idx;
+ Res := Cells.Table (Idx).Res;
+ end loop;
+ Res := Create_Node (N_HDL_Expr);
+ Set_HDL_Node (Res, Hdl);
+ Cells.Append ((Res => Res, Next => No_Index));
+ Cells.Table (Idx).Next := Cells.Last;
+ return Res;
+ end Get_PSL_Node;
+end PSL.Hash;